为了账号安全,请及时绑定邮箱和手机立即绑定

如何获得 KieSession 所需的所有全局变量?

如何获得 KieSession 所需的所有全局变量?

qq_笑_17 2022-06-04 17:31:14
我正在使用 Drools,并且我将很多全局变量插入到KieSession.kieSession.setGlobal("foo", foo);kieSession.setGlobal("bar", bar);kieSession.setGlobal("baz", baz);//...我用作全局对象的每个对象都作为 Spring bean 存在,因此我突然想到,如果我有一个预期的全局变量列表,我可以简单地“自动装配”会话。Map<String, Class<?>> globals = getGlobals(kieSession);globals.forEach((name, clazz) ->     kieSession.setGlobal(name, beanFactory.getBean(clazz)));有一个方法被调用getGlobals,但它似乎只返回已经插入的全局变量。通过附加调试器,我可以看到这些值的映射存在于内部KieBase,我编写了一个方法来通过反射获取它:@SuppressWarnings("unchecked")@SneakyThrows //Lombok turns the checked exceptions into uncheckedprivate Map<String, Class<?>> getGlobals(final KieSession session){    final KieBase kieBase = session.getKieBase();    final Field globals = kieBase.getClass().getDeclaredField("globals");    globals.setAccessible(true);    return (Map<String, Class<?>>) globals.get(kieBase);}这可行,但除非绝对必要,否则我宁愿不诉诸反思。有没有更好的方法来实现这一点?如果没有,是否有充分的理由封装这些信息以使我通常无法访问它?
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您可以从KiePackage. 只需迭代从 KieBase 获得的 KiePackages。


final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();

for (KiePackage kiePackage : kiePackages)

{

    final Collection<Global> globalVariables = kiePackage.getGlobalVariables();

    //...

}


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号