在maven编译阶段使用generateModel=YES
选项将DRL编译为Java时,不维护类型声明的元数据。我在下面概述的一个简单示例中复制了此内容。
是否需要一些其他配置来保存元数据并在Java类定义中进行复制?
示例的设置如下:
我有一个简单的Drools&maven项目,其中包含一个DRL文件和一个具有main()方法的Java类,该方法仅加载类路径容器并打印其内容。
在没有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()返回null:
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));
}
}
}
}
}
}
}