gpt4 book ai didi

java - Drools:调用 addPackageFromDrl(source) 时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 05:46:19 24 4
gpt4 key购买 nike

我正在尝试在 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");

结束

一如既往,我们非常感谢您的帮助。韩国,

尼尔斯

编辑:在调试过程中,我注意到 PackageBuilder 中的内部构建器对象为空,包和包描述也是如此。我通过手动添加此描述解决了最初的问题:

    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)

当从规则中删除package行时,我的示例会一直执行,但不会打印任何内容。我又忽略了什么吗?我想这与 drl 本身的问题有关,考虑到一切都与包的声明有关。需要明确的是,drl 被加载到包 be.ugent.intec.doctr.processor.job.fever 中包含的类中。

谢谢!

最佳答案

在编译期间不应发生 NullPointerException:要么在解析期间出现明显的编译错误(包括行号),要么它可以工作。 Drools 4.0.7 已经很旧了。 这可能已经在较新版本的 drools 中得到修复。如果没有,请提出 JIRA 问题。

尝试更新版本的 drools,最好是 5.2 版本(5.2.0.CR1 将在今天晚些时候或明天发布),它使用新的、更好的解析器。

关于java - Drools:调用 addPackageFromDrl(source) 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com