Вся документация CDI разъясняет, что CDI делает типобезопасным внедрение зависимостей - и это возвышенное свойство CDI.ИМХО, то, что вы пытаетесь сделать, это то, что CDI пытается избежать.Вы хотите, чтобы контейнер передавал Object
каждому типу, а CDI не работает таким образом.
Точки инъекции stringValue
и integerValue
могут получать только бин, имеющий java.lang.String
и java.lang.Integer
в его списке типы бинов соответственно.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 в свою пользу:)