【问题标题】:Is it possible to create multiple custom validation message for @Valid argument exception?是否可以为 @Valid 参数异常创建多个自定义验证消息?
【发布时间】:2019-10-22 02:10:33
【问题描述】:

我想为我的自定义验证注释创建自定义消息。如果此验证失败,则会引发 MethodArgumentNotValidException。因为我为@RequestBody 设置了@Valid。

我创建@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);
}

【问题讨论】:

    标签: java rest spring-boot constraints bean-validation


    【解决方案1】:

    您可以在控制器建议中覆盖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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2019-08-31
      • 2019-07-05
      • 2015-09-09
      • 1970-01-01
      • 2016-02-13
      • 2017-08-30
      • 2012-12-12
      相关资源
      最近更新 更多