Я боролся со слюнями, которые долго загружали правила при запуске приложения. По этой причине я пытался использовать плагин 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]