我正在尝试在OSGi应用程序中执行一个简单的 HelloWorld 规则。但是在解析和编译期间,会发生以下异常:
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中的内部构建器对象为null,包和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 :(得分:0)
编译期间不应发生NullPointerException
:要么在解析过程中遇到明确的编译错误(包括行号),要么它可以正常工作。 Drools 4.0.7已经过时了。 这可能已在较新版本的drools中修复。如果不是,请提出JIRA问题。
尝试更新的drools版本,最好是5.2版本(5.2.0.CR1将在今天或明天晚些时候发布),它使用新的,更好的解析器。