Плагин Drools Maven не понимает объявленные локально перечисления при компиляции файлов DRL - PullRequest
1 голос
/ 11 июля 2019

Я боролся со слюнями, которые долго загружали правила при запуске приложения. По этой причине я пытался использовать плагин drools maven для предварительной компиляции моих правил. Однако при переносе моих существующих файлов DRL я обнаружил, что некоторые из них не компилируются.

Это происходит, когда мы объявили enum в файлах DRL и позже используем его в правиле в файле. Ошибка, кажется, происходит, потому что она не понимает перечисление. то есть неквалифицированный тип в строгом режиме для: SomeEnum

Я обновился до последней версии drools (7.23.0) и упростил пример до простейшего варианта использования, который я могу себе представить.

У меня есть модульный тест, который читает файл DRL в тесте как Ресурс DRL и выполняет правило, и этот тест проходит. Но когда я пытаюсь скомпилировать само правило, возникают проблемы с компиляцией.

Кроме того, если я удаляю перечисление и использую жестко закодированное значение, тест проходит в обоих случаях.

Мой файл DRL


declare enum SomeEnum
    ENUM_KEY(1234L);

    key: Long
end

rule "0_SomeRule"
    dialect "mvel"
    salience 3
    when
            response : Response ()
            request : Request ()
    then
            response.key = SomeEnum.ENUM_KEY.getKey();
end

Мой файл kmodule

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="Test" packages="com.rawb.droolstest">
        <ksession name="Test.session" type="stateless"/>
    </kbase>
</kmodule>

Неудачный тест:

    public void testKJar() throws Exception {
        KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        StatelessKieSession kSession = kContainer.newStatelessKieSession("Test.session");
        runRules(kSession);
    }

    private void runRules(StatelessKieSession kSession) {
        List<Command> commands = new ArrayList<>();
        commands.add(CommandFactory.newInsert(new Request(), "request"));
        commands.add(CommandFactory.newInsert(new Response(), "response"));
        commands.add(CommandFactory.newFireAllRules());

        ExecutionResults executionResults = kSession.execute(CommandFactory.newBatchExecution(commands));

        Response response = (Response) executionResults.getValue("response");
        assertEquals(response.getKey(), 1234L);
    }

Сообщение об ошибке, которое я получаю при выполнении теста, выглядит следующим образом

[Ошибка: неквалифицированный тип в строгом режиме для: SomeEnum] [Рядом: {... response.key = SomeEnum.ENUM_KEY.getKey (); ....}] ^ [Строка: 1, столбец: 16]

...