Drools: NullPointerException, когда вызывается addPackageFromDrl (источник) - PullRequest
1 голос
/ 01 мая 2011

Я пытаюсь выполнить простое правило HelloWorld в приложении OSGi.Однако во время синтаксического анализа и компиляции возникает следующее исключение:

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.Вот мой код приложения и 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");

end

Как всегда, помощь высоко ценится.KR,

Niels

РЕДАКТИРОВАТЬ: Во время отладки я заметил, что внутренний объект builder в 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.

Thx!

1 Ответ

0 голосов
/ 02 мая 2011

A NullPointerException не должно происходить во время компиляции: либо вы получаете явную ошибку компиляции во время синтаксического анализа (которая включает в себя номер строки), либо это работает.Слюни 4.0.7 старые. Вероятно, это уже исправлено в более новой версии drools. Если это не так, поднимите вопрос JIRA.

Попробуйте более новую версию drools, предпочтительно дажеВерсия 5.2 (5.2.0.CR1 выйдет позже сегодня или завтра), в которой используется новый, лучший парсер.

...