类加载器错误的流口水“规则编译错误com.drools.dynamic.HelloWorld无法解析为类型”

时间:2019-03-11 00:39:37

标签: java groovy classloader drools kie

Drools版本7.12.0.Final

我试图将DRL文件和类定义动态加载到Drools引擎中,但是在解析类类型时遇到错误。我能够缩小错误范围,可以使用以下常规代码重新创建该错误。

// Define class as string
def path = "com.example.drools.dynamic"
def name = "HelloWorld"
def classDef = """
package ${path}

class ${name} {
    String hello
    boolean fired
}
"""

// Parse class into loader and create an instance
def loader = new GroovyClassLoader()
def myClass = loader.parseClass(classDef)
def bean = myClass.newInstance()
bean.setHello("hello")
bean.setFired(false)

// Rule as string
def myRuleString = """
import ${path}.*;

rule 'test rule'
    when
        test: ${name}(hello == 'hello')
    then
        System.out.println('rule fired');
        test.setFired(true);
end
"""

// Build Drools
def kieServices = KieServices.Factory.get()
def kfs = kieServices.newKieFileSystem()
kfs.write("src/main/resources/dynamicRules.drl", kieServices.getResources().newReaderResource(new StringReader(myRuleString)))
def kieBuilder = kieServices.newKieBuilder(kfs, loader).buildAll()
def kieContainer = kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId())
def kieSession = kieContainer.newKieBase(kieServices.newKieBaseConfiguration()).newStatelessKieSession()

// Run Drools
def kieCommandFactory = kieServices.getCommands()
def commands = [
    kieCommandFactory.newInsert(bean),
    kieCommandFactory.newFireAllRules("outFired")
]
def execResults = kieSession.execute(kieCommandFactory.newBatchExecution(commands))

drools引擎能够访问和过滤我的bean(我的规则字符串中的“何时”部分)。可以通过删除test.setFired(true);中的行myRuleString来显示。如果删除此行,则一切正常,并显示“ rule fired”。

问题在于,无法在Drools引擎中的任何地方将对象“ test”作为com.example.drools.dynamic.HelloWorld类的实例进行解析

0 个答案:

没有答案