详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)

当使用 @Validated、@GroupSequence 和自定义校验规则时,可以实现对实体类属性的分组校验
首先,定义验证分组的接口:

public interface Group1 {}
public interface Group2 {}

@GroupSequence({Group1.class, Group2.class})
public interface MyValidationGroupSequence {}

然后,创建一个实体类,并应用验证分组的约束和自定义校验规则:

public class User {
    @NotBlank(groups = Group1.class)
    private String username;

    @Size(min = 6, max = 20, groups = Group2.class)
    @CustomValidation(groups = Group2.class)
    private String password;

    // 省略构造函数、getter 和 setter 方法
}

在上述示例中,User 类应用了不同分组的约束。username 字段在 Group1 分组中不能为空白(@NotBlank),password 字段在 Group2 分组中必须是长度在 6 到 20 之间的字符串,并通过 @CustomValidation 标记了自定义校验规则。

接下来,定义一个自定义校验注解和校验器:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CustomValidator.class)
public @interface CustomValidation {
    String message() default "Invalid value";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class CustomValidator implements ConstraintValidator<CustomValidation, String> {
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.matches("[A-Za-z0-9]+");
    }
}

在上述示例中,定义了一个名为 CustomValidation 的自定义校验注解,并将它应用在 password 字段上。同时,实现了 CustomValidator 类,对属性值进行自定义校验。

最后,创建一个服务类,并在方法参数上应用 @Validated 和验证分组注解进行校验:

@Service
@Validated
public class UserService {
    public void createUser(@Validated(MyValidationGroupSequence.class) User user) {
        // 创建用户的业务逻辑
    }
}

在上述示例中,createUser 方法使用了 @Validated 注解来启用方法参数校验,并通过 @Validated(MyValidationGroupSequence.class) 指定了要验证的分组。

使用该服务类进行方法调用时,会按照 @GroupSequence 中指定的顺序依次对分组进行校验,并执行自定义校验规则。

注意,为了使自定义校验规则生效,需要在 Spring 配置文件(如配置类)中配置自定义校验器,当然springboot环境已经自动注入了:

@Configuration
public class AppConfig {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}

以上展示了结合 @Validated、@GroupSequence 和自定义校验规则的用法,以实现分组校验和自定义校验逻辑。具体的验证逻辑和业务约束根据实际需求进行定义和实现。

MethodValidationPostProcessor作用

MethodValidationPostProcessor 是 Spring 提供的一个后置处理器,用于在方法调用时对方法参数进行校验。

当将 MethodValidationPostProcessor 添加到 Spring 容器中时,它会自动拦截标注了 @Validated 注解的方法,并在方法调用之前执行参数校验操作。如果方法参数不满足验证约束,则抛出 MethodArgumentNotValidException 异常或 ConstraintViolationException 异常。

使用 MethodValidationPostProcessor 可以方便地在方法级别上实现参数校验,而无需显式调用 Validator 对象进行验证。

在示例中,通过在配置类中定义 MethodValidationPostProcessor 的 bean,将其添加到 Spring 容器中:

@Configuration
public class AppConfig {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}

这样,在使用 @Validated 注解标注的方法中,就可以触发方法参数的校验。例如,在 UserService 中的 createUser 方法上使用 @Validated 注解:

@Service
@Validated
public class UserService {
    public void createUser(@Validated(MyValidationGroupSequence.class) User user) {
        // 创建用户的业务逻辑
    }

}
当调用 createUser 方法时,MethodValidationPostProcessor 会拦截该方法的调用,根据 @Validated 注解和指定的验证分组(MyValidationGroupSequence.class),对 User 对象的属性进行校验。如果校验失败,则会抛出相应的异常。

总而言之,MethodValidationPostProcessor 是一个后置处理器,用于实现方法参数的校验。它简化了在方法层面进行验证的操作,提供了方便的验证机制。

显示调用

如果你不想使用 MethodValidationPostProcessor,而是显式调用 Validator 对象进行验证,可以按照以下步骤进行编写:

首先,需要注入一个 Validator 对象到你的类中。可以使用 LocalValidatorFactoryBean 或者 Validator 接口的其他实现类。

@Autowired
private Validator validator;

接下来,在方法中手动调用 validator.validate() 方法进行参数校验。假设你的方法名为 createUser,接收 User 对象作为参数。

public void createUser(User user) {
    Set<ConstraintViolation<User>> violations = validator.validate(user, MyValidationGroupSequence.class);
    if (!violations.isEmpty()) {
        // 处理校验失败的情况
        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }
    // 创建业务逻辑
}

上述示例中,validator.validate() 方法接受两个参数:要校验的对象 user 和验证分组 MyValidationGroupSequence.class。它会返回一个包含所有校验失败信息的 Set<ConstraintViolation> 集合。

如果集合不为空,说明存在校验失败的情况。可以通过遍历集合中的 ConstraintViolation 对象,获取具体的校验错误信息进行处理。

注意,在使用显式调用 Validator 对象进行验证时,需要自己处理校验失败的情况,并根据实际需求进行后续操作。

最后,确保你已经在 Spring 配置文件(如配置类)中配置了 Validator 的 bean。

@Bean
public Validator validator() {
    LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
    factoryBean.setProviderClass(HibernateValidator.class);
    factoryBean.afterPropertiesSet();
    return factoryBean.getValidator();
}

当然也可以直接使用工厂模式的对象进项校验:

public class Main {
    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        User user = new User();
        Set<ConstraintViolation<User>> violations = validator.validate(user, MyValidationGroupSequence.class);

        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }
}

以上就是使用显式调用 Validator 对象进行参数验证的方法。通过手动调用 validator.validate() 方法,可以实现对对象的参数校验,并且可以通过检查 ConstraintViolation 集合来处理校验失败的情况。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到三十五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值