2016-09-30 28 views
0

Droolsのaccumulate()関数の使用を示す非常に基本的な例を実行しようとしていますが、java.lang.NullPointerException例外が発生しています。ここDroolsでヌルポインタ例外が発生する

コードである:

Metric.java:

package com.sample; 

public class Metric 
{ 
    public String id; 
    public double value; 

    public Metric(String id, double value) 
    { 
    this.id = id; 
    this.value = value; 
    } 
} 

ruleFile1.drl:

package com.sample 

declare Metric 
    @role(event) 
end 

rule "rule1" 
when 
    Metric() 
    metricAverage: Number() from accumulate(
     Metric($value : value), 
     average($value)) 
then 
    System.out.println("metric value average " + metricAverage); 
end 

KSessionGenerator.java:

package com.sample; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 

import org.kie.api.KieBase; 
import org.kie.api.KieBaseConfiguration; 
import org.kie.api.KieServices; 
import org.kie.api.builder.KieBuilder; 
import org.kie.api.builder.KieFileSystem; 
import org.kie.api.builder.Message; 
import org.kie.api.builder.Results; 
import org.kie.api.conf.EventProcessingOption; 
import org.kie.api.runtime.KieContainer; 
import org.kie.api.runtime.KieSession; 

public class KSessionGenerator { 

    public KieSession buildKSession(String ruleFilePath){ 
    KieServices kieServices = KieServices.Factory.get(); 

    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(ruleFilePath); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    String virtualRuleFilePath = "src/main/resources/ruleFile1.drl"; 
    KieFileSystem kfs = kieServices.newKieFileSystem(); 
    kfs.write(virtualRuleFilePath, kieServices.getResources().newInputStreamResource(fis)); 

    KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); 
    Results results = kieBuilder.getResults(); 
    if (results.hasMessages(Message.Level.ERROR)) { 
     System.out.println(results.getMessages()); 
     throw new IllegalStateException("### errors ###"); 
    } 

    KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); 

    // Change the engine mode to 'stream' 
    KieBaseConfiguration config = kieServices.newKieBaseConfiguration(); 
    config.setOption(EventProcessingOption.STREAM); 

    KieBase kieBase = kieContainer.newKieBase(config); 
    KieSession kSession = kieBase.newKieSession(); 

    return kSession; 
    } 
} 

DroolsTest1.java:

package com.sample; 

import org.kie.api.runtime.KieSession; 

public class DroolsTest1 { 

    public static final void main(String[] args) { 
    try { 
     String ruleFilePath = "src/main/resources/rules/ruleFile1.drl"; 
     KieSession kSession = (new KSessionGenerator()).buildKSession(ruleFilePath); 

     // go ! 
     Metric metric1 = new Metric("m1", 50); 
     Metric metric2 = new Metric("m2", 60); 

     kSession.insert(metric1); 
     kSession.insert(metric2); 

     System.out.println("Firing all rules ..."); 
     kSession.fireAllRules(); 
     System.out.println("Rules fired!"); 

     System.out.println("Bye"); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
    } 
} 

kmodule.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> 
    <kbase name="rules" packages="rules"> 
     <ksession name="ksession-rules"/> 
    </kbase> 
</kmodule> 

例外の完全なスタックトレース:

Firing all rules ... 
java.lang.RuntimeException: java.lang.NullPointerException 
    at org.drools.core.rule.SingleAccumulate.accumulate(SingleAccumulate.java:90) 
    at org.drools.core.phreak.PhreakAccumulateNode.addMatch(PhreakAccumulateNode.java:759) 
    at org.drools.core.phreak.PhreakAccumulateNode.doLeftInserts(PhreakAccumulateNode.java:163) 
    at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:80) 
    at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:562) 
    at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533) 
    at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:334) 
    at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161) 
    at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116) 
    at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:235) 
    at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:106) 
    at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1016) 
    at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302) 
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289) 
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262) 
    at com.sample.DroolsTest1.main(DroolsTest1.java:20) 
Caused by: java.lang.NullPointerException 
    at org.drools.core.rule.Declaration.getValue(Declaration.java:228) 
    at com.sample.Rule_rule11017979978AccumulateExpression0Invoker.evaluate(Rule_rule11017979978AccumulateExpression0Invoker.java:19) 
    at org.drools.core.base.accumulators.JavaAccumulatorFunctionExecutor.accumulate(JavaAccumulatorFunctionExecutor.java:109) 
    at org.drools.core.rule.SingleAccumulate.accumulate(SingleAccumulate.java:82) 
    ... 15 more 

誰も私にその解決策と一緒に、エラーの原因を伝えることができ、私は

4.5.2 Eclipseの火星上でプラグインを介して、Droolsのバージョン6.2.0決勝を使用しています?

+0

[NullPointerExceptionとは何か、どうすれば修正できますか?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception -and-how-do-i-fix-it) – Raedwald

+1

@Raedwaldこれはどのようにその質問と重複していますか? –

+1

@ Raedwald:私はOPがNPEとは何かを十分に認識していると思います。その質問は特定の重要ではないケースをターゲットにしています。 IMHOこれは間違いなくあなたがリンクした一般的な質問の複製ではありません – hammerfest

答えて

3

はNPEがこのメトリッククラスは、そのフィールドの任意のゲッターメソッドを持たないに起因する

"$value" -> "Method threw 'java.lang.NullPointerException' exception. 
Cannot evaluate org.drools.core.rule.Declaration.toString()" 

によって引き起こされる、コードを試してみました。 getterを追加すると、問題なくコードが実行されます

+0

これはエラーを解決します。しかし、私はどのように理解できませんか?ゲッターの存在がルールの実行に影響を与える理由は何ですか?とにかくクラスプロパティは公開されています。また、あなたが言及したエラー - 「org.drools.core.rule.Declaration.toString()」を評価できません。質問に書いたスタックトレースには存在しません。どうしましたか? –

+1

stacktraceにはorg.drools .core.rule.Declaration.getValue(Declaration.java:228)。このメソッドにブレークポイントを設定すると、デバッガにラップされたエラーが表示されます。クラスフィールドは、フレームワークエンジンによる処理のために可視であることを必ずしも意味するものではなく、私はDroolsについて詳しくはチェックしませんでしたが、これまでの他のフレームワークでも同様の問題を抱えていました。プライベートフィールドとパブリックゲッターメソッドを使用するのが良い方法です。 – hammerfest

関連する問題