对于业务方来说,在进行某种业务时,需要校验其是否满足其产品规则
/**
* 根据当前给定的bean对表达式expression进行求值(仅仅是求值,并不对表达式的合法性验证):
* 求值结果为Object,该object的实际值是:boolean或者数字.
*
* @param expression
* 规则表达式
* @param bean
* 类型为CalculatorBean
* @return
*/
public static Object getValueOfExpression(String expression, CalculatorBean bean) {
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
Field[] fields = FinanceCalculatorBean.class.getDeclaredFields();
ValueExpression ve = null;
ValueExpression result = null;
try {
for (Field f : fields) { // 给context设置变量参数(这些参数本质是CalculatorBean的属性)
String fieldName = f.getName();
Class fieldTypeCls = f.getType();
if ("java.lang.String".equals(fieldTypeCls.getName())||"java.lang.Boolean".equals(fieldTypeCls.getName())||
"java.lang.Long".equals(fieldTypeCls.getName())||"java.lang.Double".equals(fieldTypeCls.getName())||
"java.lang.Float".equals(fieldTypeCls.getName())||"java.lang.Integer".equals(fieldTypeCls.getClass().getName())||
"java.lang.Date".equals(fieldTypeCls.getName())||"java.math.BigDecimal".equals(fieldTypeCls.getName())) {
PropertyDescriptor pd = new PropertyDescriptor(fieldName, bean.getClass());
Method method = pd.getReadMethod();
context.setVariable(fieldName, factory.createValueExpression(method.invoke(bean), fieldTypeCls));
}
}
ve = factory.createValueExpression(context, expression, Object.class);
Object tmpRes = ve.getValue(context); // 第一次求值,结果为字符串
result = factory.createValueExpression(context, "${" + tmpRes + "}", Object.class); // 对第一次结果二次求值
} catch (Exception e) {
log.error("规则解析出错!",e);
}
return result.getValue(context);
}
如果返回为false校验不通过
规则配置说明
expression中规则表达式字段,一定是CalCulatorbean中字段,否则无法校验,返回false,则此条规则不满足。先循环规则,在循环体内调用以上方法