Добавление архива CDI-бинов из модуля jboss на лету
Я строю архитектуру плагинов JEE с использованием wildfly (и модулей jboss, которые включены в ядро wildfly).
в настоящее время я работаю, загружая xhtml из других развернутых модулей (core-web.war загружает файлы xhtml из deployment.customers.jar
или любой deployment.xmodule.jar
) благодаря получению шаблонов / файлов Facelets из внешней файловой системы или базы данных и "реестра расширений", который я использую, чтобы узнать, какие модули доступны.
Проблема возникает, когда я пытаюсь использовать управляемые bean-компоненты из этих развернутых модулей, потому что аннотации не сканируются, я не знаю, так ли это, потому что мне нужен пользовательский компонент в JSF, EL, Classpath, CDI или Jboss Module.
Я использую Wildfly 10, JEE 7, Primefaces 6.
Какой самый простой способ заставить это работать.
Вот некоторые из моих попыток:
Я прочитал документацию по модулям jboss и обнаружил, что зависимости модуля не могут быть изменены после инициализации модуля. Но я обнаружил, что могу получить доступ к любому модулю программно. например:
Module currentMod = org.jboss.modules.Module.getCallerModule(); Module otherModule = currentMod.getModuleLoader().loadModule(ModuleIdentifier.create("deployment.inmuebles-web.jar")); otherModule.getClassLoader().loadClass("co.hatit.enterprise.inmuebles.beans.InmueblesBean");
Я прочитал документ CDI, и там написано, что я могу прослушивать события жизненного цикла, такие как обнаружение типов и компонентов, но я не уверен, что это то, что мне нужно.
public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd, BeanManager beanManager) { try { Field f = ClassLoader.class.getDeclaredField("classes"); f.setAccessible(true); //Get all classes from other module ClassLoader classLoader = org.jboss.modules.Module.getCallerModule().getModuleLoader() .loadModule(org.jboss.modules.ModuleIdentifier.create("deployment.customers-web.jar")) .getClassLoader(); List<Class> classes = (List<Class>) f.get(classLoader); for (Class<?> clazz : classes) { final AnnotatedType<?> annotatedType = beanManager.createAnnotatedType(clazz); bbd.addAnnotatedType(annotatedType); } } catch (Exception e) { e.printStackTrace(); } }
Я также пытался создать собственный распознаватель эль, но он не работает.
public class PluginELResolver extends ELResolver { @Override public Object getValue(ELContext ctx, Object base, Object property) { return CDI.current().getBeanManager().getBeans("inmueblesBean"); } }