接口上的自定义限定符在注入时不起作用
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 文档。
问题:
你好,我在 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 文档。