Ошибка, когда мы пишем правила drools в строковом буфере - PullRequest
0 голосов
/ 25 апреля 2019

Я устанавливаю правила drools, используя строковый буфер, в котором правила будут строиться из данных БД. Ниже приведен фрагмент кода для подготовки правил в строковом буфере.

    List<DbRules> dbRuleList = getAllRules();   
    KieSession kieSession = null;
    StringBuffer ruleBuffer = new StringBuffer();
    ruleBuffer.append("import com.model.ContractHeader; import static com.service.SupplierService.isRuleAppliesToSupplier;  ");
    for(DbRules rule : dbRuleList) {
        ruleBuffer.append(" rule \""+rule.getRuleName()+"\" when  eval( isRuleAppliesToSupplier( cHeader : ContractHeader (supplierName) , "+rule.getRuleId()+" )) && ("+rule.getLhs()+") then "+rule.getRhs()+" end; ");
    }    

Я получаю ниже исключения в консоли:

Exception in thread "main" java.lang.RuntimeException: Unable to get 
KieModule, Errors Existed: Error Messages:
Message [id=1, kieBase=defaultKieBase, level=ERROR, path=rules/Sample.drl, 
line=1, column=0
text=Rule Compilation error cHeader cannot be resolved to a variable
Syntax error on token ":", invalid AssignmentOperator
supplierName cannot be resolved to a variable]

Предупреждающие сообщения:

Информационные сообщения:

at org.drools.compiler.kie.builder.impl.KieBuilderImpl.getKieModule(KieBuilderImpl.java:467)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.getKieModule(KieBuilderImpl.java:453)
at com.sample.StringDrools.executeRules(StringDrools.java:88)
at com.sample.StringDrools.main(StringDrools.java:41)

1 Ответ

0 голосов
/ 25 апреля 2019

Ошибка компиляции устраняется путем некоторой модификации кода. Спасибо!

  for(DbRules rule : dbRuleList) {
        ruleBuffer.append(" rule \""+rule.getRuleName()+"\" when cHeader:ContractHeader()  eval( isRuleAppliesToSupplier(  (cHeader.getSupplierName()) , "+rule.getRuleId()+" )) && ("+rule.getLhs()+") then "+rule.getRhs()+" end; ");
    }
...