我的项目技术堆栈是:JavaEE 8、Wildfly、Jboss 和这样的结构:
companycontext
- company
- workplace
- employee
- web (beans.xml here)
我在公司和工作场所项目中都有EmployeeAdapter接口(interface)。 因为 CDI 会发现每个项目中的每个 bean,所以我会收到错误
A component named 'EmployeeAdapterImpl' is already defined in this module
目前我的解决方案名称如下:ComEmployeeAdapter、WorkEmployeeAdapter... 我可以使用@Named
之类的东西吗// Implement
@Stateless @Named("company")
EmployeeAdapterImpl implement EmployeeAdapter
// Using
@Inject @Named("company") private EmployeeAdapter
// Implement
@Stateless @Named("workplace")
EmployeeAdapterImpl implement EmployeeAdapter
// Using
@Inject @Named("workplace") private EmployeeAdapter
我认为这比命名我们的适配器的规则要好得多。
非常感谢。
最佳答案
这是 EJB 问题,而不是 CDI 问题。
CDI bean 类型由完全限定的类名定义,因此在不同包中存在两个具有相同名称的 bean 是没有问题的。
由于您的两个 EmployeeAdapterImpl bean 是无状态 session bean,因此 EJB 容器将为它们生成 JNDI 名称。您可以在 WildFly 日志中的消息中看到它们,例如
16:09:39.812 [MSC service thread 1-8] INFO org.jboss.as.ejb3.deployment - WFLYEJB0473: JNDI bindings for session bean named 'Foo' in deployment unit 'deployment "myapp.war"' are as follows:
生成的名称之一具有以下形式
java:module/EmployeeAdapterImpl
仅采用简单的类名,因此这会导致您的情况发生冲突。
您可能想尝试 @Stateless
注释的 name
或 mappedName
元素。
关于java - 我可以在 JavaEE 8 中注入(inject) 2 个同名的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327496/