java - 是否可以为 @Valid 参数异常创建多个自定义验证消息?

标签 java rest spring-boot constraints bean-validation

我想为我的自定义验证注释创建自定义消息。如果此验证失败,则会抛出 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 {};
}

我的 Controller 建议方法来处理所有 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);
}

最佳答案

您可以重写 Controller 建议中的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);
}
或者,在您的 Controller 类中,您可以通过抛出自定义异常来处理它,然后在 Controller 建议中单独处理它(不是针对验证异常,而是针对所有其他运行时异常,这种方法更适合处理异常):

@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";
} 

然后在您的 Controller 建议类中,您可以使用传递给异常的消息,例如:

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

关于java - 是否可以为 @Valid 参数异常创建多个自定义验证消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496221/

相关文章:

java - 如何将两个相关对象以一对一关系保存到数据库中

caching - 如何在Redis缓存列表中按元素值查找?

java - 该算法的时间复杂度: is it O(n^2) or O(n)

java - Spring 。发生事件时如何手动连接数据库

java - 使用wiremock进行Rest API模拟: java

php - 在 Magento 2 REST Api 中获取所有具有自定义属性的类别

java - 是否可以使用Java 8进行Android开发?

java - HTTPS 问题 - 在运行 Java 应用程序时,一些用户会收到 SEC7111

php - 使用带有身份验证的 PHP 进行 Firebase REST 访问

java - 无法在 Spring Boot 2.0.0 中 Autowiring 身份验证管理器