Можно ли создать несколько пользовательских сообщений проверки для исключения аргумента @Valid? - PullRequest
0 голосов
/ 22 октября 2019

Я хочу создать собственное сообщение для моей пользовательской аннотации проверки. Если эта проверка не удалась, она генерирует исключение MethodArgumentNotValidException. Потому что я поставил @Valid для @RequestBody.

Я создаю @ControllerAdvice для обработки / переопределения сообщения MethodArgumentNotValidException. У меня есть этот класс ошибок перечисления отдельно. Таким образом, каждая ошибка, которая выдает такое исключение, будет выдавать то же сообщение, что и Invalid Param

. Мой вопрос: возможно ли исключить мое пользовательское сообщение проверки и вместо этого выдает другое сообщение? Как сделать, чтобы это @MyCustomAnnotation выдавало другое сообщение об исключении? Не подпадает под сообщение MethodArgumentNotValidException.

Мой пользовательский интерфейс проверки

@Documented
@Constraint(validatedBy = myValidator.class)
@Target({FIELD, METHOD, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckMyCode{
    String message() default "{my custom string message}";
    Class<?> [] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Мой метод рекомендации контроллера для обработки всех исключений MethodArgumentNotValidException

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException exception, HttpHeaders headers, HttpStatus status, WebRequest request){
        CustomClassError<Object> error = CustomClassError.failure(ErrCode.INVALID_PARAM);
        return new ResponseEntity<Object>(error, new HttpHeaders(), HttpStatus.OK);
}

1 Ответ

1 голос
/ 22 октября 2019

Вы можете переопределить метод handleMethodArgumentNotValid в совете контроллера следующим образом (кажется, это тот случай использования, который вам нужен):

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    List<String> details = new ArrayList<>();
    for(ObjectError error : ex.getBindingResult().getAllErrors()) {
        details.add(error.getDefaultMessage());
    }
    ErrorResponse error = new ErrorResponse("Validation Failed", details);
    return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
}

В противном случае в вашем классе контроллера вы можете обработать его, вызвав специальное исключениеа затем обрабатываете его отдельно в рекомендации контроллера (не для исключения проверки, но для всех других исключений времени выполнения, этот подход предпочтителен для обработки исключения):

@PostMapping("/addValidate")
public String submitForm(@Valid ValidatedData validatedData,
  BindingResult result, Model m) {
    if(result.hasErrors()) {
         List<FieldError> errors = bindingResult.getFieldErrors(); // provided only for your information
         for (FieldError error : errors ) {
             System.out.println (error.getObjectName() + " - " +error.getDefaultMessage());
          }
        throw new CustomExceptionClass("Your could assign the field error custom message here");
    }
    m.addAttribute("message", "Success"
      + validatedData.toString());
    return "Home";
} 

, а затем в классе рекомендаций контроллера вы можете использоватьэто сообщение передается в виде исключения:

@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
    List<String> details = new ArrayList<>();
    details.add(ex.getLocalizedMessage()); //just call the message method to get the message in the exception
    ErrorResponse error = new ErrorResponse("Server Error", details); //Custom error response class to return json response
    return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...