我有一个CDI生产者方法-根据与本示例不相关的某些条件-创建不同类型的对象:
public class TestProducer {
@Produces @TestQualifier
public Object create(InjectionPoint ip) {
if(something) {
return "a String";
} else {
return Integer.valueOf(42);
}
}
但是使用此生产者时,在以下情况下我总是会出错:
@Named("test")
public class TestComponent {
...
@Inject public void setA(@TestQualifier String stringValue) {
...
@Inject public void setB(@TestQualifier Integer integerValue) {
仅当生产者的create方法的方法签名中具有预期的类型时,此方法才有效:
public class TestProducer {
@Produces @SpringBean
public String create(InjectionPoint ip) {
现在已经正确注入了String,但是我无法从生产者方法中生成整数。但这正是我要避免的事情,因为生产者本身应该是完全通用的。
我是在做错什么,还是没有办法实现我想要的行为?
所有CDI文档都清楚地表明CDI确实进行了类型安全的依赖项注入-它是CDI的崇高属性。恕我直言,您要做的就是CDI要避免的事情。您希望容器转换Object
为每种类型,而CDI不能那样工作。
注入指向stringValue
并且integerValue
只能接收在其bean类型列表中分别具有java.lang.String
和java.lang.Integer
的bean。java.lang.Object
不满足此条件。
我有两个建议。首先,由于您有两个或多个不同类型的注入点,因此请为该类型创建两个或多个生成器方法:
public class TestProducer {
@Produces @TestQualifier
public String createString(InjectionPoint ip) {
if(something) {
return "a String";
} else {
// Some other value
}
}
@Produces @TestQualifier
public int createInt(InjectionPoint ip) {
if(something) {
return 42;
} else {
// Some other value
}
}
// ...
如果something
条件仅是检查注射点的类型(我所打赌的情况),则它起作用。
但是,如果something
条件确实使用注入点的类型以外的其他条件来决定类型,我建议您自己做“肮脏的工作”:将返回的值注入到Object
类型化的注入点中,并手动进行转换:
@Named("test")
public class TestComponent {
...
@Inject public void setA(@TestQualifier Object value) {
String stringValue = (String) value;
...
@Inject public void setB(@TestQualifier Object value) {
int intValue = (Integer) value;
要点是,与其他一些DI框架不同,CDI不能在Java类型系统上工作-相反,它大量使用它。不要尝试与之抗争,而是使用CDI的这一方面对您有利:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句