接口上的自定义限定符在注入时不起作用

Custom qualifiers on interface doesn't work on injection

问题:

你好,我在 java EE 上遇到问题,我必须使用 @Inject @Stateless 等注释,但在阅读了大量文档和示例等之后,我无法找到解决方案看来我的代码应该可以工作,但绝对不行。所以问题是我在这样的界面上有一个自定义限定符

 @Qualifier
 @Retention(RUNTIME)
 @Target({METHOD, FIELD, PARAMETER, TYPE})
 public @interface BudgetsDs {
 }

我想像这样将它作为成员字段注入到另一个对象中

@Dependent
public class BudgetService  {

@BudgetsDs
@Inject
DataSource budgetsDS;

... some getter, setter , etcetc...

}

我已经通过了这个

https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html

和其他与此类似的文档。 我试过 @EJB , @Stateless 但它不起作用。 我认为我目前在注释上遗漏了一件大事, 因此,如果您有好的教程、好的建议或解释,我想听听。 我不要求一个完整的答案,但我想至少有一些线索。 欢迎任何人提供帮助。

编辑: 确切错误在线

@BudgetsDs
@Inject
DataSource budgetsDS;

budgetDS 抛出不满足的依赖关系:没有 bean 与注入点匹配

Edit2: 解决方案

1) 我实现了一个新的 class ResourceProducer 正如 John Ament 所建议的 我使用@Produces 和@Resource(name="jdbc/myDataSource"), 对于我需要的每个数据源。

public class ResourceProducer {

@Produces
@BudgetsDs
@Resource(name="jdbc/BudgetsDs")
public DataSource budgetsDs;

@Produces
@OtherDs
@Resource(name="jdbc/OtherDs")
public DataSource otherDs;

...  

}

2) 每个连接的不同自定义限定符

 // In a file 
 @Qualifier
 @Retention(RUNTIME)
 @Target({METHOD, FIELD, PARAMETER, TYPE})
 public @interface BudgetsDs {
 }

 // In a another file
 @Qualifier
 @Retention(RUNTIME)
 @Target({METHOD, FIELD, PARAMETER, TYPE})
 public @interface OtherDs {
 }

3) 这样注入效果很好,我可以在我想要的地方注入不同的数据源,就像这样:

@Dependent
public class BudgetService  {

@BudgetsDs
@Inject
DataSource budgetsDS;

@OtherDs
@Inject
DataSource otherDs;
... some getter, setter , etcetc...

}

下面还有另一种解决方案,同样有效。

感谢 aribeiro 和 John Ament。 我关于堆栈溢出的第一个问题,社区的回答非常好

您收到的错误是由于容器不知道如何将您创建的限定符与任何 bean 类型的任何实现相匹配。

documentation 所述:

A qualifier is an annotation that you apply to a bean

因此,为了克服提到的错误,您需要将相应的限定符应用于每个 DataSource 实现:

@BudgetsDs
public class BudgetDataSource extends DataSource {
    (...)
}

@OtherDs
public class OtherDataSource extends DataSource {
    (...)
}

然后,容器将能够在您注入 bean 时针入正确的实现:

@Dependent
public class BudgetService  {

    @BudgetsDs
    @Inject
    DataSource budgetsDS;

    (...)
}

@Dependent
public class OtherService {

    @Inject
    @OtherDs
    DataSource otherDS;

    (...)
}

附带说明一下,我注意到您正在关注 Java EE 6 文档。我建议您遵循 latest Java EE 文档。