easy-rules spring boot集成使用二


前邊有簡單使用spring boot + mvel + json 模版的格式,以下是集成spring spel的說明
具體的代碼就不貼了,主要說明使用以及一些問題

注意對於beanResolver 的支持需要4.0.0-SNAPSHOT 版本

spel rule 代碼定義

 
Rules rules = configRules.fetchConfigRules();
SpELRule spELRule = new SpELRule();
// setting an condition to be evaluated
BeanResolver beanResolver = new SimpleBeanResovler(SpringBeanUtil.getApplicationContext());
spELRule.description("bean demo");
spELRule.priority(20);
spELRule.when("#user.age < 38");
spELRule.then("@myService.setInfo(#user)",beanResolver);
Facts facts = new Facts();
// 生成一個唯一id,方便基於數據id規則流程查詢
user.setUniqueId(UUID.randomUUID().toString());
MyRule<User> rule = new MyRule<User>();
rules.register(spELRule);
ules.register(rule);

配置文件在SpELRuleFactory方式加載

package com.appdemo.demo;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.spel.SpELRuleFactory;
import org.jeasy.rules.support.JsonRuleDefinitionReader;
import org.jeasy.rules.support.RuleDefinitionReader;
import org.springframework.expression.BeanResolver;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.stereotype.Component;
import java.io.FileReader;
/**
 * @author dalong
 * 加載rule文件
 */
@Component
public class ConfigRules {
    public Rules fetchConfigRules() throws Exception {
        BeanResolver beanResolver = new SimpleBeanResovler(SpringBeanUtil.getApplicationContext());
         // 注意beanResolver的傳遞
        SpELRuleFactory ruleFactory = new SpELRuleFactory(new JsonRuleDefinitionReader(),beanResolver);
        Rules jsonRules = ruleFactory.createRules(new FileReader(DemoApplication.class.getClassLoader().getResource("rules-json.json").getFile()));
        return jsonRules;
    }
}

一個參考spel json 配置文件

[{
  "name": "1",
  "description": "1",
  "priority": 1,
  "compositeRuleType": "UnitRuleGroup",
  "composingRules": [
    {
      "name": "2",
      "description": "2",
      "condition": "#{#user.age >= 18}",
      "priority": 2,
      "actions": [
        "#{@myService.setInfo(#user)}",
        "#{T(com.appdemo.demo.UserService).doAction4(#user)}"
      ]
    }
  ]}
]

簡單說明

因為spel 支持使用spring bean,但是因為目前SpELRuleFactory 在處理spel 以及對於beanResolver參數傳遞上beanResolver
不能共享,造成對於SpELRule rule 的定義需要自己配置beanResolver,如果真的需要使用spel,推薦還是使用java 代碼方
式(這樣可以更好的利用spring的特性)

參考資料

https://github.com/j-easy/easy-rules/wiki/expression-language-support 
https://github.com/j-easy/easy-rules/wiki/getting-started 
https://github.com/rongfengliang/easy-rules-spring-learning/tree/spel


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM