产品规则校验

对于业务方来说,在进行某种业务时,需要校验其是否满足其产品规则

/**
	 * 根据当前给定的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,则此条规则不满足。先循环规则,在循环体内调用以上方法