所有CDI文档都清楚地表明CDI进行了类型安全依赖注入 – 它是CDI的崇高属性.恕我直言,你要做的就是CDI试图避免的.您希望容器将Object强制转换为每种类型,而CDI不会以这种方式工作.
注入点stringValue和integerValue只能接收一个分别在其bean types列表中包含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
}
}
// ...
如果某些条件只是为了检查注入点的类型(我认为是这种情况),它就可以工作.
但是,如果某些条件确实使用除注入点类型之外的其他条件来决定类型,我建议自己执行“脏工作”:将返回值注入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的这方面对你有利:)