最近的需求:对请求报文(dto中嵌套着dto)进行校验,包含非空校验,枚举类校验,正则校验(yyyy-mm-dd)这种。
**参考文章(程序猿杨鲍)**思路写的很好哦
Spring AOP+反射实现自定义动态配置校验规则,让校验规则飞起来
涉及三张表
t_template_info
其中check_level 是优先级校验,若为必传字段也需要符合枚举类型,我们需要先校验有没有值,如果有值再去与枚举匹配。这时候非空校验的优先级为1,枚举校验的优先级为2。
template_id varchar(16) NOT NULL COMMENT ‘模板编号’,
template_desc varchar(64) DEFAULT NULL COMMENT ‘模板描述’,
template_status tinyint(4) NOT NULL DEFAULT ‘1’ COMMENT ‘模板状态(0:不使用,1:使用)’,
check_level int(11) NOT NULL COMMENT ‘检查优先级’
t_template_rule_info
这里一个rule_id可以匹配多个template_id。
值为空,若字段类型为必传枚举类-(必传,枚举)-“不能为空”;
若字段类型为非必传枚举类(枚举类)-不报错。
rule_id varchar(16) NOT NULL COMMENT ‘规则编号’,
template_id varchar(16) NOT NULL COMMENT ‘模板编号’,
rule_express varchar(128) NOT NULL COMMENT ‘规则表达式’,
toast_msg varchar(128) NOT NULL COMMENT ‘提示信息’,
rule_status tinyint(4) NOT NULL DEFAULT ‘1’ COMMENT ‘规则状态’
t_bean_rule_info
因为涉及到枚举类型校验,我这边新增了一个字段枚举类,存的值是xxxx.xxxx.xxxEnum路径
bean_id varchar(32) NOT NULL COMMENT ‘实体类编号’,
rule_id varchar(16) NOT NULL COMMENT ‘规则编号’,
field_name varchar(32) NOT NULL COMMENT ‘字段名’,
enum_name varchar(128) DEFAULT NULL COMMENT ‘枚举类’,
field_desc varchar(128) DEFAULT NULL COMMENT ‘字段描述’,
check_status tinyint(4) DEFAULT ‘1’ COMMENT ‘是否校验’
原来文章写的很不错,我这边就加一个枚举类校验的方法。
CheckEngine.java其中有个枚举类是以|隔开的,所以有加特殊判断,我所有的枚举类都有getCode()这个方法,所以才能这么写哦。
public String dictionary(IcCheckRuleDTO roleModel) throws ClassNotFoundException, NoSuchMethodException {
String[] values = null;
if ("xxxxx".equals(roleModel.getFieldName())) {
values = roleModel.getFieldValue().toString().split("\\|");
} else {
values = new String[]{roleModel.getFieldValue().toString()};
}
String enumName = roleModel.getEnumName();
// 1.得到枚举类对象
Class<?> clz = Class.forName(enumName);
// 2.得到所有枚举常量
Object[] objects = clz.getEnumConstants();
Method getCode = clz.getMethod("getCode");
// 得到所有枚举code
List<String> enumCodeList = Arrays.stream(objects).map(a -> {
try {
return getCode.invoke(a).toString();
} catch (IllegalAccessException | InvocationTargetException e) {
return null;
}
}).collect(Collectors.toList());
for (String value : values) {
if (!enumCodeList.contains(value)) {
return generateToastMsg(roleModel);
}
}
return null;
}