美文网首页
Validation动态地选择要校验的字段

Validation动态地选择要校验的字段

作者: 熊本猫 | 来源:发表于2020-07-24 15:02 被阅读0次

    参考文章: https://juejin.im/post/5d5cb2e06fb9a06aee3634db

    背景

    Product类中有以下字段,其中name希望在type=1时候做非空校验,price希望在type=2的时候做非空校验,简单说就是待校验的字段是动态可变的、灵活的

    @NotNull
    private String name;
    
    private String addr;
    @NotNull
    private String price;
    
    private Byte type;
    

    实现方法

    创建一个新的provider

    public class ProductGroupSequenceProvider implements DefaultGroupSequenceProvider<Product> {
    
        @Override
        public List<Class<?>> getValidationGroups(Product product) {
            List<Class<?>> defaultGroupSequence = new ArrayList<>();
            defaultGroupSequence.add(Product.class); // 这一步不能省,否则Default分组都不会执行了
            if (product != null) { // 这块判空请务必要做
                Byte type = product.getType(); //获取要做判断的字段
                if ( type.equals((byte)1)) {
                    defaultGroupSequence.add(Product.IsTypeOneGroup.class); //把要做校验的分组加到defaultGroupSequence
                } else if (type.equals((byte)2)) {
                    defaultGroupSequence.add(Product.IsTypeTwoGroup.class);//把要做校验的分组加到defaultGroupSequence
                }
            }
            return defaultGroupSequence;
        }
    }
    

    使用创建的provider
    在Product类前添加注解,添加2个group接口,然后给要校验的注解添加groups属性

    @GroupSequenceProvider(ProductGroupSequenceProvider.class)
    public class Product {
        @NotNull(groups = {IsTypeOneGroup.class})  //为组一时做校验
        private String name;
        private String addr;
        @NotNull(groups = {IsTypeTwoGroup.class}) //为组二时做校验
        private String price;
        private Byte type;
    
         public interface IsTypeOneGroup{};
         public interface IsTypeTwoGroup{};
    }
    

    此时再运行程序,就会根据type的值去判断不同的字段是否为空了~

    相关文章

      网友评论

          本文标题:Validation动态地选择要校验的字段

          本文链接:https://www.haomeiwen.com/subject/tkijlktx.html