Moqui中的KIE组件,出现错误无法解析ObjectType

时间:2019-03-22 17:33:22

标签: drools kie moqui

我已经使用KIE组件和drools规则来创建运输产品的计算规则。我在* .drl中定义了规则,如下所示:

我的*.drl文件:

package shipment.orderrate;
dialect "mvel"
import org.mag.erp.model.Product
function Double calculateVolume(Double height, Double width, Double depth){
    if(height == null || width == null || depth == null){
        return 0d;
    }
    if(height == -1 || width == -1 || depth == -1){
        return 0d;
    }
    return height * width * depth;
}

rule "Calculate Shipping_by_volumne"
when
    $p: Product(calculateVolume(height, width, depth) >= 0.0, calculateVolume(height, width, depth) < 100.0, shippingTotal == null
then
    modify($p){
        setShippingTotal(80000.0)
    };
end

java文件类Product.java位于我的组件中,带有源代码:

package org.mag.erp.model;

import java.io.Serializable;

public class Product implements Serializable {
    private String productId;
    private Double height;
    private Double width;
    private Double weight;
    private Double depth;
    private Double shippingTotal;

    //*getter and setter property*
} 

当我开始moqui时,它给了我这个错误:

00:06:57.151 ERROR         main            o.drools.c.k.b.i.KieProject Unable to build KieBaseModel:MagOrderShippingRateKB
Unable to resolve ObjectType 'Product' : [Rule name='Calculate Shipping_by_volumne']

Unable to Analyse Expression @Modify with($p){        setShippingTotal(80000.0)    };:
[Error: unable to resolve method using strict-mode: org.drools.core.spi.KnowledgeHelper.$p()]

但是,如果我将Product.java文件移动到org.moqui.util 组件中的moqui-util package ,然后将import org.mag.erp.model.Product编辑为{我的import org.moqui.util.Product文件中的{1}}, moqui 将正常启动,并且没有错误。

为什么会这样?当我将*.drl放入此组件时,moqui-util中使KieBase正确构建的特殊配置是什么?

1 个答案:

答案 0 :(得分:0)

这看起来像是ClassLoader问题。为了支持在类路径中添加运行时,Moqui使用支持此行为的自定义ClassLoader,包括“运行时”目录下或组件目录中的“类”和“ lib”目录。自定义ClassLoader(MClassLoader)设置为servlet容器中每个线程或内部为Moqui后台作业创建的线程等的上下文ClassLoader。

KIE'mvel'脚本发生此情况的最可能原因是它不使用当前线程的上下文ClassLoader(即mvel编译器未使用它)或它在未通过Moqui Framework初始化的线程中运行,因此线程的上下文ClassLoader尚未设置。

解决此问题的第一步是研究mvel编译器的类加载选项。可能有一个配置文件的文件,但是很有可能需要一个API选项,也许是显式指定ClassLoader以便它使用线程的上下文ClassLoader。如果您想要寻求帮助,那就不再是真正的问题了,并且不属于StackOverflow。 Moqui网站上描述了可用的Moqui社区协作资源:

https://www.moqui.org/m/docs/moqui/Community+Guide