Если у меня есть такой REST-контроллер пружины, как этот
@PostMapping(
value = "/configurations",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public CreateConfigurationResponse createConfiguration(
@RequestBody @Valid @NotNull final CreateConfigurationRequest request) {
// do stuff
}
, и клиент вызывает эту конечную точку с неправильным типом носителя в заголовке Accept
, тогда пружина выдает HttpMediaTypeNotAcceptableException
.Затем наш обработчик исключений перехватывает это и создает ответ об ошибке Problem
(rfc-7807)
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class HttpMediaTypeExceptionHandler extends BaseExceptionHandler {
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public ResponseEntity<Problem> notAcceptableMediaTypeHandler(final HttpMediaTypeNotAcceptableException ex,
final HttpServletRequest request) {
final Problem problem = Problem.builder()
.withType(URI.create("...."))
.withTitle("unsupported media type")
.withStatus(Status.NOT_ACCEPTABLE)
.withDetail("...error stuff..")
.build();
return new ResponseEntity<>(problem, httpStatus);
}
Но поскольку ответ об ошибке Problem
должен быть отправлен обратно с типом носителя application/problem+json
, то пружина увидитэто как недопустимый тип носителя и снова вызывает обработчик исключений HttpMediaTypeExceptionHandler
и говорит, что тип носителя недопустим.
Есть ли в Spring способ остановить этот второй цикл в обработчике исключений, и хотя заголовок accept не включает тип носителя application/problem+json
, он все равно просто вернет его?