该注解修饰属性,表示会对太属性进行拆解(我们这里的核查只核查最上面的一层,而对于复杂属性则不会再向里进行核查)

  1. /**
  2. * 该注解用于标志复杂结构体,用于向内部解析,只有添加该注解,对应的结构才能解析
  3. * @author zhouzhenyong
  4. * @since 2019/3/7 下午10:19
  5. */
  6. @Target(ElementType.FIELD)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface Check {}

场景:

不添加@Check

@Data
@Accessors(chain = true)
public class BEntity {

    @Matcher({"a","b"})
    private String name;
    private AEntity aEntity;
}
@Data
@Accessors(chain = true)
public class AEntity {

    @Matcher({"a", "b", "c", "null"})
    private String name;
    @Matcher(value = {"null"}, accept = false)
    private Integer age;
    private String address;
}

其中在BEntity实体中,属性aEntity没有添加@Check,则属性aEntity内部中的属性 name 即使有不合法的值存在,也会校验通过,因为核查的时候是不会核查复杂结构中的数据的。只有添加了@Check,才会向内部解析。

类型的支持

@Check 目前除了支持普通的复杂结构之外,也支持泛型类型

  1. 标签类型
  2. 类型匹配符
  3. 通配符
  4. 泛型数组

    1.标签类型

    // <>标签 这种泛型
    @Data
    @Accessors(chain = true)
    public class ParameterizedTypeEntity {
    
     private String word;
    
     @Check
     private Map<String, DataEntity> dataEntityMap;
    }
    

    2.类型匹配符

    // TypeVariable:类型匹配符
    @Data
    @Accessors(chain = true)
    public class TypeVariableEntity<T> {
    
     private Integer pageNo;
     @Matcher(range = "[0, 100]", value = "null")
     private Integer pageSize;
    
     @Check
     private T data;
    
     @Check
     private List<T> dataList;
    }
    

    3.通配符

    // 通配符测试
    @Data
    @Accessors(chain = true)
    public class WildcardTypeEntity {
    
    private String wildName;
    
    @Check
    private Map<String, ? extends DataEntity> dataMap;
    }
    

    4.泛型数组

    // 泛型数组:GenericArray
    @Data
    @Accessors(chain = true)
    public class GenericArrayTypeEntity<T> {
    
     @Check
     private T[] dataArray;
    
     @Check
     private T[][] dataArrays;
    }