2017-04-27 17 views
0

정수 값을 반환하는 외부 Java 함수를 사용하고자하는 간단한 규칙이 있습니다. 비교를 위해 규칙 LHS에서이 반환 값을 사용하려고합니다. Drools에서 바인딩 변수를 사용하는 동안 오류가 발생했습니다. 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, 레벨 = ERROR, 경로 = COM/테스트/규칙/ageRule.drl, 라인 = 13, column = 0 text = [ERR 101] 행 13:42 "testRuleBTW"규칙의 입력 '$ cfd'에서 실행 가능한 대안이 없습니다. [id = 2, level = ERROR, path = com/test/rules/ageRule.drll, line = 0, column = 0 text = 파서가 null을 반환했습니다. 패키지]] at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase (KieContainerImpl.java:433) at org.drools .compiler.kie.builder.impl.KieContainerImpl.newKieSession (KieContainerImpl.java:587) at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession (KieContainerImpl.java:558) at org.apache.catalina.core.StandardWrapper.initServlet (StandardWrapper.java:1183) at org.apache.catalina.core.StandardWrapper.loadServlet (StandardWrapper.java:1099) at org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java:989) at org.apache.catalina.core. StandardContext.loadOnStartup (StandardContext.java:4913) at org.apache.catalina.core.StandardContext.startInternal (StandardContext.java:5223) at org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:752) at org.apach org.apache.catalina.startup.HostConfig.deployWAR에서 (org.apache.catalina.startup.HostConfig.deployWAR에서 표준시 .addChild (StandardHost.java:734) 에서 org.apache.catalina.core.StandardHost.addChild (표준 HBO.java:734) e.catalina.core.ContainerBase.addChild (ContainerBase.java:728) HostConfig.java : 952) at org.apache.catalina.startup.HostConfig $ DeployWar.run (HostConfig.java:1823) at java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:471) at java.util.concurrent.FutureTask.run (FutureTask.java:262) java.util.concurrent.ThreadPoolExecutor $ Worker.run에서 java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) 에서 (ThreadPoolExecutor입니다. java : 615) at java.lang.Thread.run (Thread.java:745)

답변

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; 
    } 

    // ... 
} 

를 구현하고 규칙에서 사용합니다.

0

많은 검색 결과를 얻은 후에 아래와 같이 처리했습니다.

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