Как я могу получить все глобальные переменные, необходимые для KieSession? - PullRequest
0 голосов
/ 05 февраля 2019

Я использую Drools и вставляю довольно много глобалов в KieSession.

kieSession.setGlobal("foo", foo);
kieSession.setGlobal("bar", bar);
kieSession.setGlobal("baz", baz);
//...

Каждый объект, который я использую как глобальный, существует как bean-компонент Spring, и поэтому происходитмне, что если бы у меня был список ожидаемых глобальных переменных, я мог бы просто «автоматически связать» сессию.вставлен.

После присоединения отладчика я вижу, что карта этих значений существует внутри KieBase, и я написал метод для получения этого с помощью отражения:

@SuppressWarnings("unchecked")
@SneakyThrows //Lombok turns the checked exceptions into unchecked
private 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 Ответ

0 голосов
/ 05 февраля 2019

Вы можете получить глобалы от KiePackage.Просто повторяйте KiePackages, которые вы получаете от KieBase.

final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
for (KiePackage kiePackage : kiePackages)
{
    final Collection<Global> globalVariables = kiePackage.getGlobalVariables();
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...