Getting null pointer exception while running hello

2019-01-25 22:26发布

问题:

I got the following error while running a simple helloworld sample drools project.

199 [main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
java.lang.NullPointerException
    at com.sample.DroolsTest.main(DroolsTest.java:24)

Code:

package com.sample;

import org.kie.api.KieServices; import
org.kie.api.runtime.KieContainer; import
org.kie.api.runtime.KieSession;

/**  * This is a sample class to launch a rule.  */ public class
DroolsTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");

            // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            kSession.insert(message);
            kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public static class Message {

        public static final int HELLO = 0;
        public static final int GOODBYE = 1;
        private String message;
        private int status;

        public String getMessage() {
            return this.message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(int status) {
            this.status = status;
        }

    }

}

drools code:

package com.sample
import com.sample.DroolsTest.Message;

rule "Hello World"
when
    m : Message( status == Message.HELLO, myMessage : message )
then
    System.out.println( myMessage );
    m.setMessage( "Goodbye cruel world" );
    m.setStatus( Message.GOODBYE );
    update( m );
end

rule "GoodBye"
when
    Message( status == Message.GOODBYE, myMessage : message )
then
    System.out.println( myMessage );
end

回答1:

It looks drools kie-api/internal library execution looks for mandatory values under src\main\resources\META-INF\maven\pom.properties file for the drools eclipse project.

Updating my pom.xml or pom.properties into below content worked fine on 6.0.0 drools distribution.

groupId=com.test.sample.drools
artifactId=DroolsTestProject
version=1


回答2:

I recently started with JBPM and ran into a similar problem. I had two issues that needed to be sorted out.

First I need to create the pom.properties file that was listed in Another answer in this thread. I had to create the src/main/resources/META-INF/maven/pom.properties file since it was not automatically generated when I created a new JBPM Maven project through eclipse. The file should have the following information, which should match your project's pom file:

groupId=com.sample
artifactId=jbpm-example
version=1.0.0-SNAPSHOT

The other issue I ran into was having a blank kmodule.xml. This should be in src/main/resources/META-INF/kmodule.xml. You will need the following in the file:

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="process" packages="process">
        <ksession name="ksession-process"/>
    </kbase>
</kmodule>

If you look at the newKieSession method parameter, it need to match the "name" attribute of the ksession element. The "packages" attribute of the kbase element needs to match the package name where you DRL files are located.



回答3:

Little late on the answer here, but...

I checked my pom.properties file, and it only contained this:

groupId=
artifactId=
version=

Nothing was defined! Changed it to:

groupId=DroolsTest
artifactId=DroolsTest
version=0.0.1-SNAPSHOT  

Taking whatever you have as those properties in pom.xml and putting them in pom.properties fixed my problem. Runs fine now.



回答4:

The sample project dependencies are configured using Maven. You need to either run "mvn eclipse:eclipse" on the command line, or install the m2e Eclipse plugin.



回答5:

Had the same problem and worked fine after adding .drl file to classpath, as discussed in following thread http://drools.46999.n3.nabble.com/Null-pointer-exception-when-adding-drools-to-existing-project-td4027944.html#a4028011



回答6:

There was a very constructive discussion on this topic that pretty much nailed it over here: DISCUSSION.



回答7:

check your kmodule.xml You must add the new ksession in there. also when defining a new kbase in that file, make sure the name is different for each kbase and the package name is where the rules are. ksession name is what you specified in the execution when you initiated a ksession.