我可以在JavaEE8中注入两个同名的接口吗?

我可以在JavaEE8中注入两个同名的接口吗?,java,jakarta-ee,jboss,cdi,Java,Jakarta Ee,Jboss,Cdi,我的项目techstack是:JavaEE8、Wildfly、Jboss 结构如下: companycontext - company - workplace - employee - web (beans.xml here) 我在公司和工作场所项目中都有EmployeeAdapter接口。 因为CDI将发现每个项目中的每个bean,所以我将得到一个错误 A component named 'EmployeeAdapterImpl' is already defined in

我的项目techstack是:JavaEE8、Wildfly、Jboss 结构如下:

companycontext
  - company
  - workplace
  - employee
  - web (beans.xml here)
我在公司和工作场所项目中都有EmployeeAdapter接口。 因为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问题

CDIBean类型是由一个完全限定的类名定义的,因此在不同的包中有两个同名的bean是没有问题的

由于您的两个
EmployeeAdapterImpl
bean是无状态会话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
仅使用简单的类名,因此在您的案例中会导致冲突


您可能需要尝试
@无状态
注释的
名称
映射名称
元素。

很抱歉,不清楚。不,它不起作用,请注意,我在每个项目中都有一个EmployeeAdapter接口。您必须以不同的方式命名您的类,例如,
CompanyEmployeeAdapterImpl
,并将其与限定符一起使用:
@qualifier(“CompanyEmployeeAdapterImpl”)private EmployeeAdapter a
,并分别用于其他classIt作品!嗯,但若我必须为每个项目命名不同的类,那个么它并没有太大的不同,因为每个项目的名称接口不同。需要以某种方式选择多个实现,并以这种方式使用bean。即使使用xml,您也必须执行相同的操作。这听起来像是原始帖子的真正解决方案。CDI不应该在这里造成麻烦,但EJB会。让它生成不同的JNDI是一种方法。使用@Stateless(name=“CompanyEmployeeAdapterImpl”)我仍然需要制定一个命名规则。我希望有一个类似于包的bean名称:company.EmployeeAdapterImpl。谢谢你的解释。