我已经使用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
正确构建的特殊配置是什么?
答案 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社区协作资源: