При использовании опции generateModel=YES
для компиляции DRL в Java на этапе компиляции maven метаданные в объявлениях типов не поддерживаются.Я воспроизвел это в простом примере, изложенном ниже.Есть ли какая-то дополнительная конфигурация, необходимая для поддержания и воспроизведения метаданных в определениях классов Java?
Настройка для примера приведена ниже:
У меня есть простой проект Drools & mavenс одним файлом DRL и классом Java с методом main (), который просто загружает контейнер пути к классу и печатает его содержимое.
При сборке и запуске без плагина drools-model-compiler или без указанияСвойство generateModel метаданные правильно считываются из типов фактов DRL.Выходные данные дают следующее содержимое контейнера:
Base: all
Session: all.stateful
Package: ollij93
Rule: AimplB
FactType: ollij93.FactA
MetaData: myMetaData = VALUEA
FactType: ollij93.FactB
MetaData: myMetaData = VALUEB
Однако при построении с указанием -DgenerateModel=YES
, указанным в сборке, выходные данные показывают, что getMetaData () возвращает нуль:
Base: all
Session: all.stateful
Package: ollij93
Rule: AimplB
FactType: ollij93.FactA
No MetaData
FactType: ollij93.FactB
No MetaData
Источник для приведенных выше примеров приведен ниже:
rules.drl:
package ollij93;
declare FactA
@myMetaData(VALUEA)
end
declare FactB
@myMetaData(VALUEB)
a : FactA @key
end
rule AimplB
when $a : FactA()
then
kcontext.insertLogical(new FactB($a));
end
Run.java:
package ollij93;
import java.util.Map;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.definition.type.FactType;
import org.kie.api.runtime.KieContainer;
public class Run {
public static void main(String[] args) {
KieServices kServices = KieServices.Factory.get();
KieContainer kContainer = kServices.getKieClasspathContainer();
for (String baseName : kContainer.getKieBaseNames()) {
System.out.println("Base: " + baseName);
KieBase kbase = kContainer.getKieBase(baseName);
for (String sessionName : kContainer.getKieSessionNamesInKieBase(baseName)) {
System.out.println(" Session: " + sessionName);
}
for (KiePackage p : kbase.getKiePackages()) {
System.out.println(" Package: " + p.getName());
for (Rule r : p.getRules()) {
System.out.println(" Rule: " + r.getName());
}
for (FactType f : p.getFactTypes()) {
System.out.println(" FactType: " + f.getName());
Map<String, Object> mData = f.getMetaData();
if (mData == null) {
System.out.println(" No MetaData");
} else {
for (String key : mData.keySet()) {
System.out.println(" MetaData: " + key + " = " + mData.get(key));
}
}
}
}
}
}
}