我定义了两个 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
对于范围,请检查 oracle 的 page
还有一个很好的博客解释了 Qualifiers
关于java - CDI - Bean 名称不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52636624/