迁移到 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...
上起作用
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...
上起作用