迁移到 WildFly 后,其接口未找到 Bean

Bean not found by its interface after migration to WildFly

JEE 应用程序迁移后(从 JBoss 7.1.1 到 WildFly 8.2.1),我们获取 CDI Beans 的方法停止工作。该应用程序有几个模块(独立的 JAR 文件)组合成一个 WAR 文件,现在部署在 WildFly 上。

要注入的Bean在模块service中,它正在实现接口IProcessor:

@Loggable
@Monitorable
@Singleton
@ConcurrencyManagement(CONTAINER)
@Lock(READ)
@LocalBean
@ApplicationScoped
public class Processor implements IProcessor {
[...]

在应用程序的另一个模块 (common) 中还有其余的逻辑:接口 IProcessor 和我们搜索它的 class。

这是检索 BeanManager 的方式:

public void keepBeanManager(@Observes AfterBeanDiscovery abd, BeanManager beanManager) {
    bm = beanManager;
}

呼叫是这样完成的:

Set<Bean<?>> jobBeans = bm.getBeans(IProcessor.class);

我尝试使用 Adam Bien 的 sample 打印出所有已部署的 beans,同时调用 getBeans 方法,我可以在其中看到 Processor .此外,如果提供完整的包和 Processor 的 class 名称作为临时 hack,但使用 IProcessor 接口永远行不通,jobBeans 始终为空。

模块service对模块common不可见,这就是使用接口完成注入的原因。

因为它之前在 JBoss 而不是在 WildFly 中工作,我认为它与 AS 处理 Beans 的方式有关,迁移后 WildFly 的配置中是否缺少某些内容?

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

来自JEE definition of LocalBean

Designates that a session bean exposes a no-interface view

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

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

上起作用