遇到带有限定符和泛型的cdi无法正常工作的情况。

例如,我有这样的界面:

public interface SomeInterface<T> {
   T someMethod(Set<T> set);
}


它的实现(以及带有其他限定符的其他几种实现):

@SomeQualifier
public class SomeClass implements SomeInterface<AnotherClass> {
    AnotherClass someMethod(Set<AnotherClass> set) {...some logic...}
}


还有一些这样的限定词:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface SomeQualifier {}


因此,当我将其注入到某个bean中时(在我的项目中为单个):

@Singleton
@Startup
public class SomeSingleton {
  @Inject
  @SomeQualifier
  SomeInterface instance;

  ..usage...
}


我在部署过程中遇到异常

Unsatisfied dependencies for type SomeInterface with qualifiers @SomeQualifier


但是当我在不使用泛型的情况下使用所有这些功能时,一切正常!

尝试这样注入:

@Inject
@SomeQualifier
SomeInterface<AnotherClass> instance;


得到了相同的结果。

知道如何将Inject与限定符和泛型一起使用吗?

最佳答案

您的第一种方法不起作用的原因是因为您违反了CDI spec assignability rules(第一行)。简而言之,注入原始类型仅适用于未绑定/ Object类型。

但是,第二种方法确实可行-我刚刚在Weld SE中进行了验证。例如。:

@Inject
@SomeQualifier
SomeInterface<AnotherClass> instance;


我想您可能忘记了重新编译代码或其他内容?再次检查,因为我确定这是可行的。那,或者您在代码中还有其他问题。

关于java - 不能对包含泛型的接口(interface)使用限定符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44648675/

10-09 22:30