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

发布于 2024-11-04 18:23:27 字数 2917 浏览 4 评论 0原文

我正在尝试在 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,

Niels

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

    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 中包含的类中。

谢谢!

I'm trying to execute a simple HelloWorld rule within an OSGi application. During parsing and compiling however, the following exception occurs:

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)

The DRL file is found by the application, since introducing syntax errors results in a failed compilation warning. I guess I'm overlooking something trivial, but haven't found it yet...

I'm using Drools 4.0.7, since this one was available on the Springsource Enterprise Bundle Repository. Here are my application code and 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

package test

rule "A stand alone rule"

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

end

As always, help is highly appreciated.
KR,

Niels

EDIT: During debugging I noticed that the internal builder object within the PackageBuilder was null, as were the package and packagedescription. I got around the original problem by adding this description manually:

    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 );

My rule was edited to the following form:

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

This however results in a compile failure:

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)

When removing the package line from the rule, then my example goes all the way through, without printing anything however. Am I again overlooking anything? I guess this is related to an issue within the drl itself, considering everything stands or falls with the declaration of the package. Just to be clear, the drl is loaded in a class contained in the package be.ugent.intec.doctr.processor.job.fever.

Thx!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧城烟雨 2024-11-11 18:23:32

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

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

A NullPointerException shouldn't happen during compilation: either you get a clear compilation error during parsing (which includes line number) or it works. Drools 4.0.7 is old. This is probably already fixed in a newer version of drools. If it isn't, raise a JIRA issue.

Try a more up-to-date version of drools, preferably even a 5.2 version (5.2.0.CR1 will be out later today or tomorrow), which uses the new, better parser.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文