我試圖在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!
你確定你'getResourceAsStream()'找到規則文件嗎? NPE發生的唯一方式就是無法找到它。你的應用程序如何打包?規則文件是否與java類名稱相同(即,您的java類位於'package test'下)? – CoolBeans 2011-05-01 18:20:42
我的意思是說只有我可以認爲NPE發生在builder.addPackageFromDrl(source)行中''如果在'getResourceAsStream()'中找不到規則文件。在這種情況下'getResourceAsStream()'應該拋出一個NPE。你可以嘗試完全限定規則文件的路徑 - 即。 '/包名/ hello.drl'? – CoolBeans 2011-05-01 18:38:41
@CoolBeans我編輯了原文,通知您我所做的更改。感謝您的幫助! – nielsn 2011-05-02 09:27:46