为了账号安全,请及时绑定邮箱和手机立即绑定

CDI - Bean 名称不明确

CDI - Bean 名称不明确

忽然笑 2021-10-27 16:26:14
我定义了两个 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]为什么?预选赛的范围是什么?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

似乎您混淆了 CDI 注释。该@Named("my_custom_name")注释用于指代班/ IMPL明确,如:


@Inject

@Named("my_custom_name")

ConcurrencyService service;

如果您没有在@Namedthen 中定义自定义名称,则默认情况下它会选择 class name ,因此您不会遇到该错误。在你的例子中:


@Named

MySqlLogService

将被称为mySqlLogService和


@Named

MySqlConcurrencyService

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


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


@RequestScoped

@SessionScoped

@ApplicationScoped

@ConversationScoped

更多信息here和here是2个例子i ii


对于范围检查 oracle 的页面


也是一个很好的博客,解释了预选赛


查看完整回答
反对 回复 2021-10-27
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

@Named无论类型如何,两个启用的 bean都不能具有相同的 bean 名称(via )。

既然是CDI,那我们看看CDI规范怎么样?让我们从2.6开始Bean names,它指出:

...在非类型安全环境(如统一表达式语言)中使用时,可以通过名称引用具有名称的 bean。...

因此,您可以在不引用其类型的情况下使用该 bean。因此需要能够将 bean 名称解析为一个特定的 bean。例如,当您从 JSF 页面使用 EL 时。

再往前一点,它写道:

根据Ambiguous names 中定义的限制,多个 bean 可以共享相同的 bean name。

这允许您实际上“破坏”名称的唯一性,只要您可以保证在类型安全解析结束时,只会找到一个具有该给定名称的 bean。

确保您的 bean 具有唯一的名称并且它会起作用。如果它只是您所追求的限定符,那么使用@Named会带来您可能不需要的开销。只需创建自己的限定符并从那里开始。


查看完整回答
反对 回复 2021-10-27
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信