[英]CDI - Bean name is ambiguous
我定义了两个 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
定义自定义名称,那么默认情况下它会选择 class name ,因此您不会遇到该错误。 在你的例子中:
@Named
MySqlLogService
将被称为mySqlLogService
和
@Named
MySqlConcurrencyService
将被称为mySqlConcurrencyService
,但我仍然不明白你想要实现的目标。
范围不是用@Named
定义的,而是使用:
@RequestScoped
@SessionScoped
@ApplicationScoped
@ConversationScoped
对于范围检查 oracle 的页面
也是一个很好的博客,解释了预选赛
无论类型如何,两个启用的 bean 都不能具有相同的 bean 名称(通过@Named
)。
既然是CDI,那我们看看CDI规范怎么样? 让我们从2.6开始。 Bean names ,它指出:
...在非类型安全环境(如统一表达式语言)中使用时,可以通过名称引用具有名称的 bean。...
因此,您可以在不引用其类型的情况下使用该 bean。 因此需要能够将 bean 名称解析为一个特定的 bean。例如,当您从 JSF 页面使用 EL 时。
再往前一点,它写道:
根据Ambiguous names 中定义的限制,多个 bean 可以共享相同的 bean name。
这允许您实际上“破坏”名称的唯一性,只要您可以保证在类型安全解析结束时,只会找到一个具有该给定名称的 bean。
确保您的 bean 具有唯一的名称并且它会起作用。 如果它只是您所追求的限定符,那么使用@Named
会带来您可能不需要的开销。 只需创建自己的限定符并从那里开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.