我正在使用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。
什么是让这个工作最简单的方法。
我的一些尝试是:
我已阅读 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 文档,它说我可以监听生命周期事件,例如类型和 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(); } }
我还尝试构建一个自定义 el 解析器,但它不起作用。
public class PluginELResolver extends ELResolver { @Override public Object getValue(ELContext ctx, Object base, Object property) { return CDI.current().getBeanManager().getBeans("inmueblesBean"); } }