项目背景介绍:
由于某电商网站的数据量比较大,价格体系变更频繁,因此采用Groovy语言对价格统一展示,设计一个价格引擎具体如下:
一 、控制层中调用Groovy脚本
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> params = JsonUtil.jsonToMap( getInParam().get("params").toString() );
TAceRule aceRule = new TAceRule();
aceRule.setName( getInParam().get("ace_rule_name").toString() );//获取groovy脚本名称
MyBatisDAO mybatisDao = (MyBatisDAO) this.getDaoFactory().get( "myBatisDAO" );
aceRule = mybatisDao.getAceRule(aceRule);
if(aceRule == null){
getOutParam().put("errorDetail", "没有配置通用规则");
return RETURN.REQ_PARAM_ERROR;
}
// 获取groovy脚本引擎
Calculate cal = CalculateManager.instant.calculate(StringUtils.hasText(aceRule.getEngine())?aceRule.getEngine():"groovy");//获取计算引擎,默认为groovy
CalculateContext context = CalculateManager.instant.context();//实例化CalculateContext 类
context.setContext("dao", getDaoFactory()); //设置Dao,Groovy引用的时候直接用dao来调用
context.setContext("session",getSession());//设置session,
context.setContext("cookie", getCookies());//设置cookie
context.setContext("inparams", params );//设置参数
cal.calculate(aceRule.getContext(), context);//参数 aceRule.getContext() 为数据库中的groovy脚本文件。
setOutParam(new HashMap<String, Object>(context.getContext()));
getOutParam().put("errorDetail", "计算完成");
return RETURN.SUCCESS;
二、CalculateManager 接口类
public enum CalculateManager {
instant;
public Calculate calculate(String script ){
//默认获取groovy
return new ScriptCalculate(script);
}
public CalculateContext context(){
retu