【问题标题】:CDI ambiguous resolution with extended class扩展类的 CDI 模糊分辨率
【发布时间】:2018-04-13 05:18:37
【问题描述】:

我需要将CacheService 注入到各种bean 中,并维护CacheService 的单例扩展,称为ResourceCacheService

interface CacheService{}
@Default
class CacheServiceImpl implements CacheService{}
@Singleton
class ResourceCacheService extends CacheServiceImpl{}

或者更好:

interface ResourceCacheService extends CacheService{}
@Singleton
class ResourceCacheServiceImpl extends CacheServiceImpl{}

无论哪种方式,我都会遇到一个模棱两可的异常。如何在需要的地方注入 CacheService 的新实例,以及创建它的 Singleton 版本?


更新 - 添加异常

Caused by: org.apache.openejb.OpenEJBRuntimeException: org.apache.webbeans.exception.WebBeansDeploymentException: javax.enterprise.inject.AmbiguousResolutionException: There is more than one Bean with type com.project.cache.CacheServiceQualifiers: [@javax.enterprise.inject.Default()]

ResourceCacheService, WebBeansType:MANAGED, Name:null, API Types:[com.project.web.ResourceCacheService,com.project.cache.CacheService,java.lang.Object,com.project.cache.CacheServiceImpl], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any] from file:/application/webapps/ROOT/WEB-INF/classes/com/project/web/ResourceCacheService.class
CacheServiceImpl, WebBeansType:MANAGED, Name:null, API Types:[com.project.cache.CacheService,java.lang.Object,com.project.cache.CacheServiceImpl], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any] from file:/application/webapps/ROOT/WEB-INF/classes/com/project/cache/CacheServiceImpl.class

【问题讨论】:

  • 你从定义中得到一个异常?或注射?使用@Named 有帮助吗?还是CDI qualifiers
  • 它在 cdi init 期间出现运行时异常。在我的场景中提供一个@Named 示例
  • 运行时异常可以是或。如果您实际上提供了您在问题中遇到的例外情况,这将很有帮助,这样我们就不必猜测了。
  • 添加了异常。我知道@Named 和CDI 限定符,但如果可能的话想避免。我认为我在想@Named 在这里很有意义

标签: jakarta-ee cdi


【解决方案1】:

基本上,你有一个继承链 C extends B extends A 并且想在不同的场景中使用 C 和 B。如果不进一步限定类就无法做到这一点,因此要么创建不同的继承方案:

interface CacheServiceBase
StandardCacheService implements CacheServiceBase
GlobalCacheService implements CacheServiceBase

// Injection of different things which do *not* extend each other
@Inject StandardCacheService
@Inject GlobalCacheService

或使用限定符注释来进一步区分实现。看这里怎么做:https://docs.jboss.org/weld/reference/latest/en-US/html/injection.html

【讨论】:

  • 问题是 StandardCacheServiceGlobalCacheService 实现将是重复的。这是如何避免的?我需要它们来扩展基本功能
  • 为什么它们会重复?或者你指的是不是全球性的?在这种情况下,请使用 @ApplicationScoped 注释
  • 不想注入混凝土,违背了 CDI 的目的。使用限定符注释
猜你喜欢
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多