java - 我可以在 JavaEE 8 中注入(inject) 2 个同名的接口(interface)吗?

标签 java jakarta-ee jboss cdi

我的项目技术堆栈是: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

目前我的解决方案名称如下:ComEmployeeAdapterWorkEmployeeAdapter... 我可以使用@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 注释的 namemappedName 元素。

关于java - 我可以在 JavaEE 8 中注入(inject) 2 个同名的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327496/

相关文章:

java - 使用 java 正则表达式进行电子邮件 ID 验证

java - 我们如何将 Jboss Fuse 即 Servicemix ASCII 更改为自定义显示

java - 为什么这个简单的调度程序不起作用?

Java Proguard 和 int 比较器

java - 无法将值添加到列表中

java - java 中带有反射的谓词

database - 什么时候提交事务?

java - 将图像编码为视频时出现 JCodec 错误

java - Spring mvc 结果页面和后退浏览器按钮

java - JBoss 上未生成线程转储