问题:
您好我在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。 关于堆栈溢出的第一个问题,社区真的很好地回答了
答案 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文档。