Add ProblemDetail and @ExceptionHandler support
ProblemDetail is a representation of an RFC 7807 "problem", and this commits adds support for it in Spring MVC and WebFlux as a return value from `@ExceptionHandler` methods, optionally wrapped with ResponseEntity for headers. See gh-27052
This commit is contained in:
@@ -46,6 +46,7 @@ import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ProblemDetail;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.codec.HttpMessageWriter;
|
||||
@@ -129,6 +130,9 @@ public class ResponseEntityResultHandlerTests {
|
||||
returnType = on(TestController.class).resolveReturnType(HttpHeaders.class);
|
||||
assertThat(this.resultHandler.supports(handlerResult(value, returnType))).isTrue();
|
||||
|
||||
returnType = on(TestController.class).resolveReturnType(ProblemDetail.class);
|
||||
assertThat(this.resultHandler.supports(handlerResult(value, returnType))).isTrue();
|
||||
|
||||
// SPR-15785
|
||||
value = ResponseEntity.ok("testing");
|
||||
returnType = on(TestController.class).resolveReturnType(Object.class);
|
||||
@@ -232,6 +236,26 @@ public class ResponseEntityResultHandlerTests {
|
||||
testHandle(returnValue, returnType);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleProblemDetail() {
|
||||
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
|
||||
MethodParameter returnType = on(TestController.class).resolveReturnType(ProblemDetail.class);
|
||||
HandlerResult result = handlerResult(problemDetail, returnType);
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/path"));
|
||||
exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_PROBLEM_JSON);
|
||||
this.resultHandler.handleResult(exchange, result).block(Duration.ofSeconds(5));
|
||||
|
||||
assertThat(exchange.getResponse().getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
|
||||
assertThat(exchange.getResponse().getHeaders().size()).isEqualTo(2);
|
||||
assertThat(exchange.getResponse().getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_PROBLEM_JSON);
|
||||
assertResponseBody(exchange,
|
||||
"{\"type\":\"about:blank\"," +
|
||||
"\"title\":\"Bad Request\"," +
|
||||
"\"status\":400," +
|
||||
"\"detail\":null," +
|
||||
"\"instance\":\"/path\"}");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleReturnValueLastModified() throws Exception {
|
||||
Instant currentTime = Instant.now().truncatedTo(ChronoUnit.SECONDS);
|
||||
@@ -505,6 +529,8 @@ public class ResponseEntityResultHandlerTests {
|
||||
|
||||
ResponseEntity<Person> responseEntityPerson() { return null; }
|
||||
|
||||
ProblemDetail problemDetail() { return null; }
|
||||
|
||||
HttpHeaders httpHeaders() { return null; }
|
||||
|
||||
Mono<ResponseEntity<String>> mono() { return null; }
|
||||
|
||||
Reference in New Issue
Block a user