我正在使用wildfly(以及wildfly核心包含的jboss模块)构建JEE插件架构。
目前我正在处理从其他已部署模块加载xhtml(core-web.war从deployment.customers.jar
或任何deployment.xmodule.jar
加载xhtml文件),这要归功于Obtaining Facelets templates/files from an external filesystem or database和"扩展名注册表"我用来了解哪些模块可用。
当我尝试使用来自这些已部署模块的托管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");
}
}