Spring REST Controller Неподдерживаемый тип носителя или нет обработчика - PullRequest
0 голосов
/ 02 марта 2019

Если у меня есть такой 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, он все равно просто вернет его?

1 Ответ

0 голосов
/ 05 марта 2019

Так странно, что он начал работать, когда я изменил выражение return с этого:

return new ResponseEntity<>(problem, httpStatus);

на следующее:

return ResponseEntity
        .status(httpStatus)
        .contentType(MediaType.APPLICATION_PROBLEM_JSON)
        .body(problem);

Я не уверен, как это работает, но этоделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...