Как мне написать правило в easy-rules, которое принимает массив строк и проверяет строку факта, используя параметр Содержит? - PullRequest
0 голосов
/ 09 мая 2019

Я использую поддержку языка выражений для написания правил в формате json, используя easy-rules .

MVELRuleFactory ruleFactory = new MVELRuleFactory(new JsonRuleDefinitionReader())
Rules rules = ruleFactory.createRules(new FileReader("user-role-rule.json"))

2 Правил

  1. dept содержит "gcs" && (заголовок содержит "Director" || заголовок содержит "manager")

  2. dept содержит любое из значений ["gcs", "ges", "ips", "csa", "sales - Обновление облака"]

Примечание: dept =«ПРОДАЖА - ОБНОВЛЕНИЕ ОБЛАКА» или «ПРОДАЖА ОБЛАКА США ПРОДАЖ»

user-role-rule.json

[
    {
        "name": "account",
        "description": "User in GCS department having either Director or Manager title",
        "priority": 1,
        "condition": "user.getDept().toLowerCase().contains(\"gcs\") && (user.getTitle().toLowerCase().contains(\"director\") || user.getTitle().toLowerCase().contains(\"manager\"))",
        "actions": [
          "user.setRole(\"account\");"
        ]
  },
  {
    "name": "account_common",
    "description": "User in CSM, IPS, CSA, SALES - CLOUD ENTERPRISE or GES department irrespective of any title",
    "priority": 1,
    "condition": "for (String dep in [\"gcs\",\"ges\",\"ips\",\"csa\",\"sales - cloud renewal\"]) {user.getDept().toLowerCase().contains(dep)}",
    "actions": [
      "user.setRole(\"account\");"
    ]
  }
]

Класс пользователя pojo

class User {
    String userId
    String dept
    String title
    List<String> role

    User(String userId, String dept, String title) {
        this.userId = userId
        this.dept = dept
        this.title = title
        this.role = new ArrayList<String>()
    }
    //..ommitting getter setters
}

Здесь первое правилос именем "account" работает нормально, но во 2-м правиле я хочу использовать список проверки строки, подпадающий под любое из ["gcs", "ges", "ips", "csa", "sales - облачное обновление"] ценности.

Примером значения dept является "ПРОДАЖА - ОБНОВЛЕНИЕ ОБЛАКА" или "ПРОДАЖА США ОБНОВЛЕНИЕ ОБЛАКА"

Исключение во втором правиле

Exception in thread "main" [Error: expected : in foreach]
[Near : {... es - cloud renewal"]) {user.getDept().toLowerCase( ....}]
                                 ^

1 Ответ

1 голос
/ 11 мая 2019

Как говорится в сообщении об ошибке, вместо in следует использовать символ двоеточия : в foreach. Просто напишите условие второго правила следующим образом:

"condition": "for (String dep : [\"gcs\", ..., \"sales - cloud renewal\"]) {user.getDept().toLowerCase().contains(dep)}"

Вы также можете проверить документацию по MVEL foreach

...