Как установить сообщение об ошибке в пользовательской оболочке исключений из аннотации @NotBlank (message = "...")? - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь создать класс @ControllerAdvice, который в настоящее время обрабатывает исключение MethodArgumentNotValidException. Я создал оболочку исключения для ответа, который имеет атрибут errorMessage и statusCode.

public class ExceptionBodyResponse {
   private String exceptionMessage;
   private int statusCode;
}

И @ControllerAdvice:

@ControllerAdvice
public class DTOExceptionHandler {

   @ExceptionHandler(MethodArgumentNotValidException.class)
   @ResponseBody
   public ExceptionBodyResponse handleInvalidArgumentException(MethodArgumentNotValidException exception) {
       return GenericBuilder.of(ExceptionBodyResponse::new)
               .with(ExceptionBodyResponse::setExceptionMessage, exception.getMessage())
               .with(ExceptionBodyResponse::setStatusCode, HttpStatus.BAD_REQUEST.value())
               .build();
      }
}

И, наконец, Класс DTO с проверкой @NotBlank:

public class RegisterRequestDto {
  @NotBlank
  private String email;

  @NotBlank(message = "Password must not be null!")
  private String password;
}

То, что я ожидаю в качестве ответа при отправке JSON с такой структурой:

{
  "email":"stack@yahoo.com";
}

- это следующее сообщение об ошибке :

{
  "exceptionMessage":"Password must not be null",
  "statusCode":400
}

Вместо этого я получаю это:

"exceptionMessage": "Validation failed for argument [0] in public packagehere.UserDto packagehere.UserControllerImpl.save(packagehere.RegisterRequestDto): [Field error in object 'registerRequestDto' on field 'password': rejected value [null]; codes [NotBlank.registerRequestDto.password,NotBlank.password,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registerRequestDto.password,password]; arguments []; default message [password]]; default message [Password must not be null!]] ",
"statusCode": 400

1 Ответ

0 голосов
/ 29 марта 2020

Попробуйте это.

@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class DTOExceptionHandler extends ResponseEntityExceptionHandler{

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(
            final MethodArgumentNotValidException exception,
            final HttpHeaders headers,
            final HttpStatus status,
            final WebRequest request) {
         return GenericBuilder.of(ExceptionBodyResponse::new)
           .with(ExceptionBodyResponse::setExceptionMessage, exception.getMessage())//You can customize message
           .with(ExceptionBodyResponse::setStatusCode, HttpStatus.BAD_REQUEST.value())
           .build();
    }
}

Вы можете использовать ex.getBindingResult().getFieldErrors(), чтобы получить список FieldError

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