该注解修饰属性,表示会对太属性进行拆解(我们这里的核查只核查最上面的一层,而对于复杂属性则不会再向里进行核查)
/**
* 该注解用于标志复杂结构体,用于向内部解析,只有添加该注解,对应的结构才能解析
* @author zhouzhenyong
* @since 2019/3/7 下午10:19
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
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.标签类型
// <>标签 这种泛型 @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; }