【发布时间】:2016-07-28 14:53:35
【问题描述】:
在 JEE 应用程序迁移(从 JBoss 7.1.1 到 WildFly 8.2.1)之后,我们获取 CDI Bean 的方法停止工作。该应用程序有几个模块(独立的 JAR 文件)组合成一个 WAR 文件,现在部署在 WildFly 上。
要注入的 Bean 在模块 service 中,它正在实现接口 IProcessor:
@Loggable
@Monitorable
@Singleton
@ConcurrencyManagement(CONTAINER)
@Lock(READ)
@LocalBean
@ApplicationScoped
public class Processor implements IProcessor {
[...]
在应用程序的另一个模块 (common) 中有其余的逻辑:接口IProcessor 和我们搜索它的类。
这是获取 BeanManager 的方式:
public void keepBeanManager(@Observes AfterBeanDiscovery abd, BeanManager beanManager) {
bm = beanManager;
}
这就是调用的方式:
Set<Bean<?>> jobBeans = bm.getBeans(IProcessor.class);
我尝试使用 Adam Bien 的 sample 打印所有部署的 bean,同时调用 getBeans 方法,我可以在其中看到 Processor。此外,如果提供 Processor 的完整包和类名可以作为临时破解,但使用 IProcessor 接口永远不会起作用,jobBeans 始终为空。
模块service对模块common是不可见的,这就是使用接口完成注入的原因。
由于它之前在 JBoss 中而不是在 WildFly 中工作,我认为它与 AS 处理 Bean 的方式有关,迁移后 WildFly 的配置中是否缺少某些东西?
【问题讨论】:
-
你试过没有@LocalBean 吗?
-
每个 JAR 都有一个
beans.xml吗? -
@JohnAment 是的,每个 JAR 都有一个 beans.xml
-
@XavierDury 成功了!删除 LocalBean 解决了这个问题。我一直在阅读 LocalBean 仅在 bean 具有无接口视图时使用。所以我想这一直是错误的,因为处理器是通过接口 IProcessor 暴露的。我想知道为什么它确实适用于 JBoss。非常感谢!
标签: java jboss cdi wildfly bean-manager