java - CDI - Bean 名称不明确

标签 java cdi

我定义了两个 Bean:

@Named("mysql")
public MySqlLogService extends AbstractLogService { ... }

@Named("mysql")
public MySqlConcurrencyService implements ConcurrencyService { ... }

我认为 Named 限定符在某种程度上与 Bean 的类型相关,但是 Weld 返回:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001414: Bean name is ambiguous. Name mysql resolves to beans: 
  - Managed Bean [class my.package.MySqlConcurrencyService] with qualifiers [@Default @Named @Any],
  - Managed Bean [class my.other.package.MySqlLogService] with qualifiers [@Default @Named @Any]
为什么?预选赛的范围是什么?

最佳答案

您似乎混淆了 CDI 注释。 @Named("my_custom_name") 注释用于显式引用该类/impl,如下所示:

@Inject
@Named("my_custom_name")
ConcurrencyService service;

如果您没有在 @Named 中定义自定义名称,那么默认情况下它会选择类名称,因此您不会遇到该错误。 在您的示例中:

@Named
MySqlLogService

将被称为mySqlLogService

@Named
MySqlConcurrencyService

将被称为 mySqlConcurrencyService ,但我仍然不明白你想要实现的目标。

范围不是用@Named定义的,而是使用:

@RequestScoped
@SessionScoped
@ApplicationScoped
@ConversationScoped

更多信息here这里有 2 个例子 i ii

对于范围,请检查 oracle 的 page

还有一个很好的博客解释了 Qualifiers

关于java - CDI - Bean 名称不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52636624/

相关文章:

java - 为什么嵌套类的私有(private)成员可以被封闭类的方法访问?

java - 如何缩短用于识别数组中单个元素的 json 路径?

jsf - java.lang.IllegalStateException : javax. naming.NamingException: 'java:comp/BeanManager' 查找失败

java - 具有参数化 bean 类的托管 bean 必须是 @Dependent : class org. apache.cxf.jaxrs.provider.AbstractCachingMessageProvider

jsf - 从 JSF @ManagedBean 迁移到 CDI @Named 后,多次调用构造函数并且提交的输入值始终为空

java - CDI 1.X 异步事件

java - 是否可以有一个泛型类,其中类型是未知维度的数组?

java - 将程序目录设置为JavaFX FileChooser的初始目录

java - 如何在不迭代的情况下获取给定 LinkedHashSet 元素的索引?

jakarta-ee - 为什么我的拦截器不工作?