springboot中@Validated手动校验实体类遇到的问题

    public Json page(@Validated @RequestBody QueryVO queryVO, BindingResult  result) {
        System.out.println("queryVO = " + queryVO);
        if (result.hasErrors()) {
            result.getFieldErrors().forEach(item->{
                System.out.println("item.getField() = " + item.getField());
                System.out.println("item.getDefaultMessage() = " + item.getDefaultMessage());
            });
        }
            return Json.succ();
    }

这里如果添加了参数BindingResult result则全局捕获异常不会生效如:

 /**
     * 处理请求参数格式错误 @RequestBody上使用@Valid 实体上使用@NotNull等,验证失败后抛出的异常是MethodArgumentNotValidException异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Json MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return Json.fail(message);
    }

    /**
     * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
     */
    @ExceptionHandler(BindException.class)
    public Json BindExceptionHandler(BindException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return Json.fail(message);
    }

    /**
     * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public Json ConstraintViolationExceptionHandler(ConstraintViolationException e) {
        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
        return Json.fail(message);
    }
Spring Boot中,手动进行验证通常涉及以下几个步骤: 1. 创建自定义验证注解:如果你想定义自定义的验证规则,首先需要创建一个新的Java注解。例如,假设我们想验证年龄是否在18到60之间: ```java import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ValidAgeRange { int min() default 18; int max() default 60; } ``` 2. 实现`ConstraintValidator`:然后你需要实现`ConstraintValidator`接口,提供具体的验证逻辑: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class ValidAgeRangeValidator implements ConstraintValidator<ValidAgeRange, Integer> { private int min; private int max; @Override public void initialize(ValidAgeRange constraintAnnotation) { this.min = constraintAnnotation.min(); this.max = constraintAnnotation.max(); } @Override public boolean isValid(Integer age, ConstraintValidatorContext context) { return age != null && age >= min && age <= max; } } ``` 3. 注册验证器:为了让Spring Boot能够识别这个新的验证注解,需要注册它: ```java import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; @Configuration public class ValidationConfig { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } } ``` 4. 使用验证注解:现在可以在实体类中使用自定义的`ValidAgeRange`注解: ```java public class User { @ValidAgeRange(min = 18, max = 60) private Integer age; // 其他字段... } ``` 5. 手动验证:在业务逻辑中,你可以使用`javax.validation.Validation` API进行验证: ```java import javax.validation.Valid; import javax.validation.Validator; import javax.validation.constraints.NotNull; public class UserController { private final Validator validator; public UserController(Validator validator) { this.validator = validator; } public boolean register(User user) { Set<ConstraintViolation<User>> violations = validator.validate(user); return violations.isEmpty(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值