接口上的自定义限定符不适用于注入

时间:2016-04-22 08:23:18

标签: java-ee cdi qualifiers

问题:

您好我在java EE上遇到问题,我必须使用像@Inject @Stateless etcetc这样的注释,但是在阅读了大量文档和示例etcetc之后,我无法获得解决方案我所编码的代码应该起作用,但绝对不行。所以问题是我在这样的界面上有自定义限定符

 @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 throw不满意的依赖关系:没有bean匹配注入点

Edit2 解决方案

1)我实现了一个新的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)这种方式注入效果很好,我可以在我想要的地方注入不同的DataSource,如下所示:

@Dependent
public class BudgetService  {

@BudgetsDs
@Inject
DataSource budgetsDS;

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

}

还有另一个解决方案,下面也有效。

感谢aribeiro和John Ament。 关于堆栈溢出的第一个问题,社区真的很好地回答了

1 个答案:

答案 0 :(得分:1)

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

正如documentation所述:

  

限定符是您应用于bean的注释

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

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

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

然后,当您注入豆子时,容器将能够针对正确的实现:

@Dependent
public class BudgetService  {

    @BudgetsDs
    @Inject
    DataSource budgetsDS;

    (...)
}

@Dependent
public class OtherService {

    @Inject
    @OtherDs
    DataSource otherDS;

    (...)
}

作为旁注,我注意到您正在关注Java EE 6文档。我建议你遵循latest Java EE文档。