场景
动态化配置校验,业务要求校验规则配置在数据库
实现
编写js方法校验传进来的对象,将方法配置在数据库中。然后java代码使用ScriptEngineManager调用方法进行校验。
paramJson是动态填写的表单,expression是配置在数据库中的校验对象的方法,适用于不同产品校验不同的必填项,或不同产品年龄限制范围不同。下面是代码测试实现
public static void main(String[] args) {
String paramJson = "{\"name\":\"张三\",\"age\":16,\"mobile\":\"13666666666\"}";
String expression ="function check(value){var obj =JSON.parse(value);if(obj.age<18){return '年龄太小'}else{return '年龄符合'}}; check(value)";
JSONObject jsonObj = JSONObject.parseObject(paramJson);
String expression2 ="function check(obj){if(obj.age<18){return '年龄太小'}else{return '年龄符合'}}; check(value)";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
try {
//传字符串
engine.put("value",paramJson);
Object obj = engine.eval(expression);
//直接传json对象
engine.put("value",jsonObj);
Object obj2 = engine.eval(expression2);
System.out.println("1---表达式结果:"+obj);
System.out.println("2---表达式结果:"+obj2);
} catch (ScriptException e) {
e.printStackTrace();
}
}
数据库配置对象的校验规则。配置js方法后,java从数据库拿到数据,使用ScriptEngineManager运行脚本。最后可以将返回的信息当校验结果返回前端。
补充加下数组,其实当js编码就行
public static void main(String[] args) {
String paramJson = "{\"name\":\"张三\",\"age\":26,\"mobile\":\"13666666666\",\"certList\":[{\"type\":\"ID\"},{\"type\":\"OFFICER\"}]}";
String expression ="function check(value){var obj =JSON.parse(value);if(obj.age<18){return '年龄太小'}else{return '年龄符合'}}; check(value)";
JSONObject jsonObj = JSONObject.parseObject(paramJson);
String expression2 ="function check(obj){if(obj.age<18){return '年龄太小'}else{return '年龄符合'}}; check(value)";
String expression3 ="function check(obj){if(obj.age<18){return '年龄太小'}else{return obj.certList[0].type}}; check(value)";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
try {
//传字符串
engine.put("value",paramJson);
Object obj = engine.eval(expression);
//直接传json对象
engine.put("value",jsonObj);
Object obj2 = engine.eval(expression2);
//3
Object obj3 = engine.eval(expression3);
System.out.println("1---表达式结果:"+obj);
System.out.println("2---表达式结果:"+obj2);
System.out.println("3---表达式测试数组结果:"+obj3);
} catch (ScriptException e) {
e.printStackTrace();
}
}