Как иметь собственные сообщения HTTP-ответа при различных сбоях десериализации Джексона? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть конечная точка Spring Web @ PostMapping , которая получает JSON и Jackson 2.10. должен привязать его к @ RequestBody DTO с парой Enum внутри. Если для поля Enum передано недопустимое значение String, я получаю

InvalidFormatException: Cannot deserialize value of type A from String "foo": not one of the values accepted for Enum class: A

Это хороший сценарий, но мой 400 Bad Request не содержит значимого сообщения внутри.

Как предоставить собственный ответ сообщения в 400 для каждого перечисления не работают?

Пример:

  • Допустимые значения для поля транзакции: BUY и SELL

  • Valid значения для группового поля: A, B, C и D

Я могу использовать некоторые аннотации javax.validation, но не могу найти нужную.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Класс преобразователя Джексона обрабатывает InvalidFormatException и выдает обобщенный c HttpMessageNotReadableException. Итак, чтобы настроить сообщение об ошибке ответа, нам нужно обработать HttpMessageNotReadableException вместо InvalidFormatException.

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({HttpMessageNotReadableException.class})
@ResponseBody
public String handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
    if(ex.getMessage().contains("Cannot deserialize value of type A")){
        return "Binding failed. Allowed values are A, B and C";
    } else if(ex.getMessage().contains("Cannot deserialize value of type B")){
        return "Binding failed. Allowed values are 1, 2 and 3";
    }
    return ex.getMessage();
}
0 голосов
/ 28 мая 2020

Вы можете добавить глобальный обработчик исключений с помощью @ControllerAdvice или добавить специальный метод контроллера с аннотацией @ExceptionHandler.

@Controller
public class SimpleController {

    //other controller methods

    @ExceptionHandler(InvalidFormatException.class)
    public ResponseEntity<Object> errorHandler(InvalidFormatException e) {
        return ResponseEntity.badRequest().body(...);
    }
}

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot -features-error-processing

ОБНОВЛЕНИЕ: Spring MVC s ExceptionHandlerMethodResolver (который обрабатывает @ExceptionHandler) разворачивает причину HttpMessageNotReadableException, поэтому будет обрабатывать InvalidFormatException: SPR-14291 . Обработка упакованных исключений

...