【问题标题】:Error while using using binding variable in Drools LHS在 Drools LHS 中使用绑定变量时出错
【发布时间】:2017-04-27 11:38:26
【问题描述】:

我有一个简单的规则,我想使用返回整数值的外部 java 函数。我想在规则 LHS 中使用这个返回值进行比较。

rule "testRuleBTW"
 when
    $cfd        : FactsData()
    condition   : RuleData( ageCondition != null, 
                                    ageCondition.value1 != null, 
                                    ageCondition.value2 != null, 
                                    "BTW" == ageCondition.conditionCode, 
                                    $returnValue : Utils.foo($cfd.dateOfBirth, ageCondition.ageUnitCode) //Want to use this value in next c
                                    ageCondition.value1 <= $returnValue, $returnValue <= ageCondition.value2)
then
//do something

但是遇到错误

java.lang.RuntimeException: 创建 KieBase 时出错 [消息 [id=1, level=ERROR, path=com/test/rules/ageRule.drl, line=13, column=0 text=[ERR 101] 第 13:42 行在规则“testRuleBTW”中的输入 '$cfd' 处没有可行的替代方案],消息 [id=2, level=ERROR, path=com/test/rules/ageRule.drll, line= 0,列=0 text=Parser 返回了一个空包]] 在 org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:433) 在 org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:587) 在 org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:558) 在 org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183) 在 org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099) 在 org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:989) 在 org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4913) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5223) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: drools drools-guvnor drools-planner


    【解决方案1】:

    您不能将变量绑定到任意表达式。

    更进一步并实施

    class Util {
    
        public static boolean fooInRange( dob Date, uc, UnitCode, ac AgeCondition ){
            if( ac.value1 == null ||
                ac.value2 == null ) return false;
            Value value = foo( dob, uc );
            return ac.value <= value && value <= ac.value2;
        }
    
         // ...
    }
    

    并在你的规则中使用它。

    【讨论】:

      【解决方案2】:

      经过大量谷歌搜索后,我设法做到了如下。

      rule "testRuleBTW"
       when
          $cfd        : FactsData()
          condition  : RuleData( ageCondition != null, 
                                          ageCondition.value1 != null, 
                                          ageCondition.value2 != null, 
                                          "BTW" == ageCondition.conditionCode)
      $ageValue  : Integer() from Utils.foo($cfd.dateOfBirth, condition.ageCondition.unitCode)
      $ctc        : FactsDataCondition(value1 <= $ageValue && $ageValue <= value2) from condition.ageCondition
      then
      //do something
      

      【讨论】:

        猜你喜欢
        • 2018-12-21
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        相关资源
        最近更新 更多