diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java index e382ed07c211..76dd55d8453d 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java @@ -361,8 +361,7 @@ private ResponseEntity toResponseEntity(Object response) { return new ResponseEntity<>(response, HttpStatus.OK); } WebEndpointResponse webEndpointResponse = (WebEndpointResponse) response; - return new ResponseEntity<>(webEndpointResponse.getBody(), - HttpStatus.valueOf(webEndpointResponse.getStatus())); + return ResponseEntity.status(webEndpointResponse.getStatus()).body(webEndpointResponse.getBody()); } @Override diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/AbstractWebMvcEndpointHandlerMapping.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/AbstractWebMvcEndpointHandlerMapping.java index 35597ea1ff00..1c30155fb8b3 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/AbstractWebMvcEndpointHandlerMapping.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/AbstractWebMvcEndpointHandlerMapping.java @@ -367,7 +367,7 @@ private Object handleResult(Object result, HttpMethod httpMethod) { return result; } WebEndpointResponse response = (WebEndpointResponse) result; - return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getStatus())); + return ResponseEntity.status(response.getStatus()).body(response.getBody()); } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/annotation/AbstractWebEndpointIntegrationTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/annotation/AbstractWebEndpointIntegrationTests.java index 53c7d1da8abe..409f14b7c398 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/annotation/AbstractWebEndpointIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/annotation/AbstractWebEndpointIntegrationTests.java @@ -380,6 +380,12 @@ void userInRoleReturnsTrueWhenUserIsInRole() { .expectStatus().isOk().expectBody(String.class).isEqualTo("ACTUATOR: true")); } + @Test + void endpointCanProduceAResponseWithACustomStatus() { + load((context) -> context.register(CustomResponseStatusEndpointConfiguration.class), + (client) -> client.get().uri("/customstatus").exchange().expectStatus().isEqualTo(234)); + } + protected abstract int getPort(T context); protected void validateErrorBody(WebTestClient.BodyContentSpec body, HttpStatus status, String path, @@ -624,6 +630,17 @@ UserInRoleEndpoint userInRoleEndpoint() { } + @Configuration(proxyBeanMethods = false) + @Import(BaseConfiguration.class) + static class CustomResponseStatusEndpointConfiguration { + + @Bean + CustomResponseStatusEndpoint customResponseStatusEndpoint() { + return new CustomResponseStatusEndpoint(); + } + + } + @Endpoint(id = "test") static class TestEndpoint { @@ -850,6 +867,16 @@ String read(SecurityContext securityContext, String role) { } + @Endpoint(id = "customstatus") + static class CustomResponseStatusEndpoint { + + @ReadOperation + WebEndpointResponse read() { + return new WebEndpointResponse<>("Custom status", 234); + } + + } + interface EndpointDelegate { void write();