Как вызвать переопределенный handleMethodArgumentNotValid в SpringBoot REST Api?

Я изо всех сил пытаюсь вызвать переопределенное исключение MethodArgumentNotValidException в моем REST API весенней загрузки. Мои другие обработчики исключений работают как шарм, однако переопределение стандартного handleMethodArgumentNotValid никогда не срабатывает?

Кто-нибудь понял, что я пропустил?

Пожо

public class FundsConfirmationRequest {
  @NotNull(message = "Required Parameter: Account Identifier.")
  private String accountId;
  @NotNull(message = "Required Parameter: Transaction Amount.")
  @Digits(integer=12, fraction=5, message = "Fractions limited to 5 digits.")
  private BigDecimal amount;
  @NotNull(message = "Required Paramater: Currency Code.")
  @Size(min = 3, max = 3, message = "Use ISO4217 Currency Code standard.")
  private String ccy;
  private String cardNumber;
  private String payee;

   public FundsConfirmationRequest() { } 
}

Контроллер-метод:

@RestController("fundsConfirmationController")
@RequestMapping(
        value = "/accounts/{accountId}/funds-confirmations"
)
public class FundsConfirmationController implements FundsConfirmationControllerI {

    @GetMapping(
            headers = {"X-CAF-MSGID", "X-AccessToken"},
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE
    )
    public ResponseEntity<?> fundsConfirmation(@RequestHeader(value = "X-CAF-MSGID") String messageId,
                                               @RequestHeader(value = "X-AccessToken") String accessToken,
                                               @Valid FundsConfirmationRequest requestParams) throws FIClientException, FIParseException {

Обработчик исключений через @RestControllerAdvice

@RestControllerAdvice
public class FundsConfirmationExceptionHandler extends ResponseEntityExceptionHandler {

    //Existing Exception Handlers
    @Override
    public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        System.out.println("Custom handleMethodArgumentNotValid method");
        FundsConfirmationError responseBody = new FundsConfirmationError(HttpStatus.BAD_REQUEST.toString(), "Input Validation Failed. Parameter.: " + ex.getParameter().getParameterName() + " Value.: " + ex.getParameter().getParameter().toString() + " " + ex.getMessage(), Severity.ERROR.toString(), Sources.LOCAL_CAF_API.toString() );
        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .header("X-CAF-ResponseID", request.getHeader("X-CAF-MSGID"))
                .body(responseBody);
    }

показать часть проверки на POJO и тело запроса

Deadpool 19.03.2019 16:19

@Deadpool: добавлены запрошенные детали. Я опустил общие вещи, такие как геттеры/сеттеры, чтобы ограничить фрагменты кода.

TomBrx 19.03.2019 16:23

для запроса GET вы не можете иметь тело и изменить запрос на POST

Deadpool 19.03.2019 16:25

Это не тело. Это параметры запроса, сопоставленные с pojo FundsConfirmationRequest. т.е. локальный хост: 8080/счета/1234/…

TomBrx 19.03.2019 16:26

Кроме того, это работает. аннотация @Valid просто никогда не вызывает мое пользовательское исключение MethodArgumentNotValidException, которое мне нужно для пользовательского тела ошибки.

TomBrx 19.03.2019 16:28

так что, если я понимаю, что вы являетесь исключением для ccy=EUR, и выдается ли такое же исключение MethodArgumentNotValidException?

Deadpool 19.03.2019 16:37

В тот момент, когда запрашивается что-либо, не подтверждающее ограничения в POJO, я получаю «400». Однако мне нужно отправить обратно настроенный responseBody. Мой переопределенный обработчик исключений в @RestControllerAdvice никогда не вызывается.

TomBrx 19.03.2019 16:39

Давайте продолжить обсуждение в чате.

Deadpool 19.03.2019 16:39

Как насчет переопределения handleBindException?

Kelvin Yong 13.11.2019 06:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
1 391
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По-видимому, это происходит из-за некоторой «магии» Spring. Это касается различных концепций, с которыми я был не очень знаком, потому что фреймворк «скрывает» эту сложность.

В моем примере у меня есть запрос GET, для которого я сопоставляю pathParams/requestParams со сложным объектом. В качестве дополнения я хочу выполнить проверку этих параметров.

Однако из-за того, как в Spring работает «привязка данных к сложным объектам», аннотации не требуются. В результате это «привязка данных», а не «отображение методов». Результирующее исключение, вызванное этим конкретным случаем, не является MethodArgumentNotValid, но является BindException.

То, как именно Spring сопоставляет данные с объектами в вызове REST, зависит от различных вещей, таких как ContentType, используемые аннотации,...

Я думаю, вам нужно добавить аннотацию @Order(Ordered.HIGHEST_PRECEDENCE) с @ControllerAdvice

@Order(Ordered.HIGHEST_PRECEDENCE)
@RestControllerAdvice
public class FundsConfirmationExceptionHandler extends ResponseEntityExceptionHandler

Другие вопросы по теме