使用CDI中的@Typed进行子类实现的模糊依赖性警告

时间:2016-07-26 03:03:58

标签: java intellij-idea cdi weld

这里,一个类是另一个类的子类。因此,@Typed注释用于防止@Inject模糊。

@Dependent
public class UserScope extends Scope {}

@Dependent
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type.
public class UserScopeAllowIdEquals extends UserScope {}

以下用法会导致Intellij中的检查警告:

public class A {
    @Inject UserScope userScope;
}
  

不明确的依赖:有多个bean匹配   注射点

但是,应用程序编译并运行,容器不将其视为定义错误。它的编写方式有问题吗?我怀疑,如果this answer to a different question是正确的,则表示只有一个bean的bean类型包含超类。

注意:正如预期的那样,以下用法不会导致Intellij检查警告。

public class B {
    @Inject UserScopeAllowIdEquals usaie;
}

1 个答案:

答案 0 :(得分:1)

基于CDI,只要有一个bean的多个实现,那么@Default限定符就不再适用。

要解决这个问题,您需要明确告诉CDI您的定义中的哪个bean是默认bean。

@Dependent
@Default
public class UserScope extends Scope {}

@Dependent
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type.
public class UserScopeAllowIdEquals extends UserScope {}

因此,当您注入Scope bean而没有任何限定符时,将选择已明确指定为默认值的bean:

@Inject
private Scope scopeBean; // The @Default annotated, if any of a Scope implementation is used.