【问题标题】:Bean not found by its interface after migration to WildFly迁移到 WildFly 后,其接口找不到 Bean
【发布时间】: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


【解决方案1】:

正如 Xavier Dury 在 cmets 中指出的那样,找不到 Bean,因为它被注释为 @LocalBean。删除 @LocalBean 注释解决了这个问题。

来自JEE definition of LocalBean

指定会话 bean 公开无接口视图

由于Processor 正在实现接口IProcessor,因此不应使用注解@LocalBean

对我来说仍然奇怪的是为什么这对 JBoss 起作用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多