Компонент KIE в moqui, получая ошибку Невозможно разрешить ObjectType - PullRequest
0 голосов
/ 22 марта 2019

Я использовал компонент 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 компонент и отредактирую import org.mag.erp.model.Product в import org.moqui.util.Product в моем *.drl файле, moqui запустится нормально и без ошибок.

Почему это случилось? Что такое специальный конфиг в moqui-util, который делает сборку KieBase без ошибок, когда я помещаю Product.java в этот компонент?

1 Ответ

0 голосов
/ 23 марта 2019

Это похоже на проблему ClassLoader. Для поддержки дополнений во время выполнения в classpath Moqui использует пользовательский ClassLoader, который поддерживает это поведение, включая каталоги 'classes' и 'lib' в каталоге 'runtime' или в каталогах компонентов. Пользовательский ClassLoader (MClassLoader) устанавливается как контекстный ClassLoader для каждого потока в контейнере сервлета или потоков, созданных внутри для фоновых заданий Moqui и т. Д.

Наиболее вероятная причина, по которой это происходит со скриптами KIE 'mvel', заключается в том, что он не использует контекстный поток текущего потока ClassLoader (то есть компилятор mvel его не использует) или работает в потоке, не инициализированном через Moqui Framework, поэтому Контекст потока ClassLoader еще не установлен.

Первым шагом для исправления этой ситуации будет исследование параметров загрузки классов для компилятора mvel. Может быть файл, в котором он сконфигурирован, но, скорее всего, необходим параметр API, возможно, для явного указания ClassLoader, чтобы он использовал контекстный класс ClassLoader. Если вам нужна помощь в достижении этой цели, это больше не вопрос и не относится к StackOverflow. Доступные ресурсы для совместной работы сообщества Moqui описаны на веб-сайте Moqui здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...