moqui 中的 KIE 组件出现错误无法解析 ObjectType
KIE component in moqui, getting error Unable to resolve ObjectType
我使用 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 文件 class 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
package in moqui-util
component 并且将我的*.drl
文件中的import org.mag.erp.model.Product
修改为import org.moqui.util.Product
,moqui会正常启动,没有错误。
为什么会这样?当我将 Product.java
放入此组件时,moqui-util
中的特殊配置是什么使得 KieBase
构建没有错误?
这看起来像是一个类加载器问题。为了支持对类路径的运行时添加,Moqui 使用支持此行为的自定义类加载器,包括 'runtime' 目录或组件目录下的 'classes' 和 'lib' 目录。自定义 ClassLoader (MClassLoader) 被设置为 servlet 容器内的每个线程或为 Moqui 后台作业等内部创建的线程的上下文 ClassLoader。
KIE 'mvel' 脚本发生这种情况的最可能原因是它没有使用当前线程的上下文 ClassLoader(即 mvel 编译器没有使用它)或者它是 运行线程未通过 Moqui 框架初始化,因此线程的上下文 ClassLoader 尚未设置。
解决此问题的第一步是研究 mvel 编译器的类加载选项。可能有一个配置它的文件,但更可能是需要一个 API 选项,可能是为了明确指定 ClassLoader,以便它使用线程的上下文 ClassLoader。如果你想要寻求帮助,这不再是一个真正的问题,也不属于 Whosebug。 Moqui 网站上描述了可用的 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 文件 class 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
package in moqui-util
component 并且将我的*.drl
文件中的import org.mag.erp.model.Product
修改为import org.moqui.util.Product
,moqui会正常启动,没有错误。
为什么会这样?当我将 Product.java
放入此组件时,moqui-util
中的特殊配置是什么使得 KieBase
构建没有错误?
这看起来像是一个类加载器问题。为了支持对类路径的运行时添加,Moqui 使用支持此行为的自定义类加载器,包括 'runtime' 目录或组件目录下的 'classes' 和 'lib' 目录。自定义 ClassLoader (MClassLoader) 被设置为 servlet 容器内的每个线程或为 Moqui 后台作业等内部创建的线程的上下文 ClassLoader。
KIE 'mvel' 脚本发生这种情况的最可能原因是它没有使用当前线程的上下文 ClassLoader(即 mvel 编译器没有使用它)或者它是 运行线程未通过 Moqui 框架初始化,因此线程的上下文 ClassLoader 尚未设置。
解决此问题的第一步是研究 mvel 编译器的类加载选项。可能有一个配置它的文件,但更可能是需要一个 API 选项,可能是为了明确指定 ClassLoader,以便它使用线程的上下文 ClassLoader。如果你想要寻求帮助,这不再是一个真正的问题,也不属于 Whosebug。 Moqui 网站上描述了可用的 Moqui 社区协作资源: