Исключение NullPointerException в Drools API

#java #nullpointerexception #drools

#java #исключение nullpointerexception #drools

Вопрос:

Я получаю исключение нулевого указателя при запуске программы Java.
addPackageFromDrl не работает должным образом, и, следовательно, pkg, возвращаемый из builder.getPackage() , равен нулю.

Я использую Drools 6

 private static RuleBase readRules() throws DroolsParserException, IOException {
    Reader source = new InputStreamReader(   
    MessageDroolsTest1.class.getClassLoader().getResourceAsStream( "rule.drl" ) );

    System.out.println("Source:"   source);

    PackageBuilder builder = new PackageBuilder();
    builder.addPackageFromDrl( source );
    System.out.println("Builder:"   builder);

    Package pkg = builder.getPackage();
    System.out.println("Package:"   pkg);

    RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    ruleBase.addPackage( pkg );
    return ruleBase;            
}  
  

Я попробовал альтернативный подход, и все же я получаю исключение во время выполнения.

 private static KnowledgeBase createKnowledgeBase() {  
    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();  
            //Add drl file into builder  
    File drl = new File("rules.drl");  
    builder.add(ResourceFactory.newFileResource(drl), ResourceType.DRL);  
    if (builder.hasErrors()) {  
        throw new RuntimeException(builder.getErrors().toString());  
    }  

    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();  
            //Add to Knowledge Base packages from the builder which are actually the rules from the drl file.  
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());  
    return knowledgeBase;  
}  
  

Ошибка

 Exception in thread "main" org.drools.RuntimeDroolsException:  
Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:  
java:org.drools.rule.builder.dialect.java.JavaDialectConfiguration'
  

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

1. Вы не используете рекомендуемую последовательность сборки для 6.x, см. Мое дополнение. — Проверьте, что org/drools/compiler/rule/builder/dialect/java/JavaDialectConfiguration.class находится в вашем drools-compiler-6.0.0.Final.jar на пути к классу. Убедитесь, что у вас нет смеси 5-x и 6-x jar-файлов в пути к классу-

2. @laune Я установил банки drools 6, и вышеуказанная ошибка исчезла. Сейчас я получаю эту ошибку. java.lang.IllegalArgumentException: Unable to instantiate service for Class 'org.drools.builder.KnowledgeBuilderFactoryService' Я не видел drools-api jar в drools 6.0 и, следовательно, скопирован из другого проекта. Разве drools-api jar не доступен в drools 6? Если нет, какой jar я должен включить для KnowledgeBuilder?

3. Это в kie-internal-6.x.x.Final.jar . Поместите все банки из дистрибутива в 1 каталог. -В большинстве случаев достаточно определения пути к классу: tag=6.0.0.Final; экспортировать ПУТЬ к КЛАССУ =».:$root/drools-core-${tag}.jar:$root/kie-api-${tag}.jar:$root/kie-internal- ${tag}.jar:$root/knowledge-internal-api-${tag}.jar:$root/drools-compiler-${tag}.jar:$root/antlr-runtime-3.5.jar:$root/ecj-3.7.2.jar:$root/mvel2-2.1.7.Final.jar:/extra/quartz-1.8.3/quartz-1.8.3.jar:$root/drools-decisiontables-${tag}.jar:$root/drools-templates-${tag}.jar:$root/protobuf-java-2.5.0.jar:$root/slf4j-api-1.7.2.jar:$root/xstream-1.4.3.jar:$SLF4J»

4. @laune Я добавил kie-внутренний импорт, и eclipse говорит KnowledgeBase , что он устарел.. Разве я не могу использовать API базы знаний?

5. Спасибо @laune, я заставил его работать..

Ответ №1:

Это работает для меня, по крайней мере, с правильным файлом DRL.

Я предлагаю вам добавить

     System.out.println("Builder:"   builder);
    if( builder.hasErrors() ){
    System.out.println("Builder has errors!");
}
  

Если это показывает, что есть ошибки, используйте другие методы для извлечения сообщений.

Drools 6 представляет целый набор новых классов (знаний *), и вы должны это использовать. Использование внутреннего API (или того, что использовалось в Drools 5) не рекомендуется, и ваш код может сломаться при любом изменении версии.

** Позже **

Простая процедура сборки для 6.x:

 public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    FileInputStream fis = new FileInputStream( "simple.drl" );
    kfs.write( "src/main/resources/simple.drl",
                kieServices.getResources().newInputStreamResource( fis ) );
    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    }
    KieContainer kieContainer =
       kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieContainer.newKieSession();
}
  

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

1. Я KnowledgeBuilder тоже пробовал. Я получаю исключение. Обновил мой вопрос.