Пускает слюни: исключение NullPointerException при вызове addPackageFromDrl (источника)

#java #nullpointerexception #drools

#java #исключение nullpointerexception #пускает слюни

Вопрос:

Я пытаюсь выполнить простое правило 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");
  

завершение

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

Нильс

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

При удалении строки package из правила мой пример выполняется до конца, однако ничего не печатается. Я снова что-то упускаю из виду? Я предполагаю, что это связано с проблемой внутри самого drl, учитывая, что все остается в силе или падает с объявлением пакета. Просто для ясности, drl загружается в класс, содержащийся в пакете be.ugent.intec.doctr.processor.job.fever .

Спасибо!

Комментарии:

1. Вы уверены, что getResourceAsStream() нашли файл правила? Единственный способ, которым может произойти NPE, — это когда он не может его найти. Как упаковано ваше приложение? Является ли файл правил тем же именем пакета, что и ваш класс Java (т.Е.. ваш класс Java находится под package test )?

2. Я хотел сказать, что единственный способ, который я могу придумать, чтобы NPE произошел в строке, builder.addPackageFromDrl( source ); если файл правил не найден в getResourceAsStream() . В этом случае getResourceAsStream() следует создать NPE. Можете ли вы попытаться полностью указать путь к файлу правил — ie. /package_name/hello.drl ?

3. @CoolBeans Я отредактировал исходное сообщение, чтобы проинформировать вас о внесенных мной изменениях. Спасибо вам за вашу помощь до сих пор!

4. Рад быть полезным! Я использую drools 5.0.1 и println там отлично работает. Итак, согласно @Geoffrey De Smet — вам нужно протестировать одну из более новых версий, чтобы увидеть, происходит ли это там или нет.

Ответ №1:

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

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

Комментарии:

1. Привет, Джеффри, спасибо тебе за твой ответ. Теперь я действительно пытаюсь использовать версию 5.2. Я посмотрю, решит ли это мою проблему. Кстати: я действительно написал сбой компиляции, но я имел в виду компиляцию в стиле drools. Возможно, синтаксический анализ был бы лучшим выбором слов. Приносим извинения за путаницу…

2. Я исправил свою проблему, самостоятельно переупаковав jar-файлы 5.2.0.M02 в пакет OSGi. Используя ту же версию Guvnor, все это работает прямо из пресловутой коробки. Спасибо вам обоим за ваш совет!