0

我正在使用wildfly(以及wildfly核心包含的jboss模块)构建一个JEE插件架构。

目前,由于从外部文件系统或数据库获取 Facelets 模板/文件以及我用来了解哪些模块可用的“扩展注册表”,我目前正在从其他已部署的模块加载 xhtml(core-web.war 从deployment.customers.jar或任何加载 xhtml 文件deployment.xmodule.jar).

当我尝试使用这些已部署模块中的托管 bean 时出现问题,这是因为未扫描注释,我不知道这是否是因为我需要 JSF、EL、Classpath、CDI 或 Jboss 模块上的自定义组件。

我正在使用 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 文档,它说我可以监听生命周期事件,例如类型和 bean 发现,但我不确定这是否是我需要的。

    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. 我还尝试构建一个自定义 el 解析器,但它不起作用。

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

0 回答 0