2011-05-01 51 views
1

我試圖在OSGi應用程序中執行一個簡單的HelloWorld規則。在解析和編譯不過,出現以下異常:當調用addPackageFromDrl(source)時出現Drools:NullPointerException

java.lang.NullPointerException 
at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:47) 
at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:446) 
at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:304) 
at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:167) 

的DRL文件是由應用程序中發現,由於在一個失敗的編譯警告引入語法錯誤的結果。我想我忽略了一些微不足道的東西,但還沒有找到它......

我使用Drools 4.0.7,因爲這個可用在Springsource Enterprise Bundle Repository上。這裏是我的應用程序代碼,DRL:

  //read in the source 
     Reader source = new InputStreamReader(getClass().getResourceAsStream("hello.drl")); 

     PackageBuilder builder = new PackageBuilder(); 


     //this wil parse and compile in one step 
     builder.addPackageFromDrl(source); 

     // Check the builder for errors 
     if (builder.hasErrors()) { 
      System.out.println(builder.getErrors().toString()); 
      throw new RuntimeException("Unable to compile \"hello.drl\"."); 
     } 

     //get the compiled package (which is serializable) 
     org.drools.rule.Package pkg = builder.getPackage(); 

     //add the package to a rulebase (deploy the rule package). 
     RuleBase ruleBase = RuleBaseFactory.newRuleBase(); 
     ruleBase.addPackage(pkg); 

     StatefulSession session = ruleBase.newStatefulSession(); 

     session.fireAllRules(); 


#created on: May 1, 2011 

封裝測試

規則 「獨立規則」

when 
    eval(true) 
then 
    System.out.println("hello world"); 

一如往常,幫助表示高度讚賞。 KR,

尼爾斯

編輯:在調試過程中,我注意到,PackageBuilder中的內部建設者對象爲空,因爲是包和packagedescription。我周圍的原問題得到了通過添加手動這樣的描述:

PackageBuilder builder = new PackageBuilder(); 
     PackageDescr packageDescr = new PackageDescr("be.ugent.intec.doctr.processor.job.fever"); 
     builder.addPackage(packageDescr); 

     //this will parse and compile in one step 
     builder.addPackageFromDrl(source); 

我的規則編輯爲以下形式:

package be.ugent.intec.doctr.processor.job.fever 
rule "hello" 
when 
    eval(true) 
then 
    System.out.println("hello there");  
end 

然而,這導致編譯失敗:

BR.recoverFromMismatchedToken 
[1,0]: unknown:1:0 mismatched token: [@0,0:6='println',<7>,1:0]; 
java.lang.RuntimeException: Unable to compile "hello.drl". 
at be.ugent.intec.doctr.processor.job.fever.FeverJob.execute(FeverJob.java:45) 
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 

當從規則中刪除行時,我的示例會一路通過,但不打印任何內容。我是否再次俯視任何東西?我想這與drl本身的一個問題有關,考慮一切表現或隨着包裹的聲明而下降。爲了清楚起見,drl被加載到包be.ugent.intec.doctr.processor.job.fever中的類中。

Thx!

+0

你確定你'getResourceAsStream()'找到規則文件嗎? NPE發生的唯一方式就是無法找到它。你的應用程序如何打包?規則文件是否與java類名稱相同(即,您的java類位於'package test'下)? – CoolBeans 2011-05-01 18:20:42

+0

我的意思是說只有我可以認爲NPE發生在builder.addPackageFromDrl(source)行中''如果在'getResourceAsStream()'中找不到規則文件。在這種情況下'getResourceAsStream()'應該拋出一個NPE。你可以嘗試完全限定規則文件的路徑 - 即。 '/包名/ hello.drl'? – CoolBeans 2011-05-01 18:38:41

+0

@CoolBeans我編輯了原文,通知您我所做的更改。感謝您的幫助! – nielsn 2011-05-02 09:27:46

回答

0

A NullPointerException在編譯過程中不應該發生:要麼在解析過程中(包括行號)得到清晰的編譯錯誤,要麼它可以工作。 Drools 4.0.7是舊的。 這可能已經在較新版本的drools中修復了。如果不是,請提出JIRA問題。

嘗試更新版本的drools,最好甚至是5.2版本(5.2.0.CR1將在今天晚些時候或明天晚些時候),它使用新的更好的解析器。

+0

嗨傑弗裏,謝謝你的回覆。我現在的確在嘗試使用5.2版本。我會看看這是否解決了我的問題。順便說一句:我確實編寫了編譯失敗,但我的意思是編寫drools的方式。也許解析會是更好的選擇。道歉的困惑... – nielsn 2011-05-02 12:40:20

+0

我解決了我的問題,重新包裝成一個OSGi包自己的5.2.0.M02罐子。使用Guvnor的同一個版本,它只是在普通的框中運行。謝謝你的建議! – nielsn 2011-05-03 07:25:51

相關問題