Добавление архива 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.

Какой самый простой способ заставить это работать.

Вот некоторые из моих попыток:

  1. Я прочитал документацию по модулям 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");
    
  2. Я прочитал документ 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();
        }
    }
    
    1. Я также пытался создать собственный распознаватель эль, но он не работает.

      public class PluginELResolver extends ELResolver {
      
          @Override
          public Object getValue(ELContext ctx, Object base, Object property) {
              return CDI.current().getBeanManager().getBeans("inmueblesBean");
          }
      }
      

0 ответов

Другие вопросы по тегам