Java CDI 实例注入泛型
Java CDI instance inject on generic type
我想编写可以在运行时注入的通用验证器对象,选择一个具体类型的 bean 来验证,但我无法使注入工作。这是接口 classes:
public interface GenericValidator<T> {
String getConfigurationCode();
ErrorMessages validate(T toValidate);
}
public class GenericValidatorConstructor<T> {
@Inject
private Instance<GenericValidator<T>> delegators;
public List<GenericValidator<T>> getValidatorsByConfig(String configCode) {
List<GenericValidator<T>> result = new ArrayList<GenericValidator<T>>();
for (GenericValidator<T> validator : delegators) {
if (configCode != null && configCode.equals(validator.getConfigurationCode()) ) {
result.add(validator);
}
}
return result;
}
}
然后我实现了一个具体的 class 和这样的字符串引用:
@Override
public String getConfigurationCode() {
return "GENERIC_PASSWORD";
}
@Override
public ErrorMessages validate(String toValidate) {
return null;
}
在无状态的 ejb 中,我以这种方式注入
@Inject
private GenericValidatorConstructor<String> passwordValidatorConstructor;
然后调用方法
passwordValidatorConstructor.getValidatorsByConfig("GENERIC_PASSWORD");
但在 getValidatorsByConfig Instance<GenericValidator<T>>
delegators 中是一个空集合,我不知道为什么。我缺少什么?
替换
@Inject
private Instance<GenericValidator<T>> delegators;
与:
@Any
@Inject
private Instance<GenericValidator<?>> delegators;
然后Instance injection就能注入你GenericValidator
的所有实现,然后你可以用GenericValidator.getConfigurationCode
到select合适的类型,或者用Instance.select(TypeLiteral<MyConcreteType>{})
到 select 适当的具体类型
我想编写可以在运行时注入的通用验证器对象,选择一个具体类型的 bean 来验证,但我无法使注入工作。这是接口 classes:
public interface GenericValidator<T> {
String getConfigurationCode();
ErrorMessages validate(T toValidate);
}
public class GenericValidatorConstructor<T> {
@Inject
private Instance<GenericValidator<T>> delegators;
public List<GenericValidator<T>> getValidatorsByConfig(String configCode) {
List<GenericValidator<T>> result = new ArrayList<GenericValidator<T>>();
for (GenericValidator<T> validator : delegators) {
if (configCode != null && configCode.equals(validator.getConfigurationCode()) ) {
result.add(validator);
}
}
return result;
}
}
然后我实现了一个具体的 class 和这样的字符串引用:
@Override
public String getConfigurationCode() {
return "GENERIC_PASSWORD";
}
@Override
public ErrorMessages validate(String toValidate) {
return null;
}
在无状态的 ejb 中,我以这种方式注入
@Inject
private GenericValidatorConstructor<String> passwordValidatorConstructor;
然后调用方法
passwordValidatorConstructor.getValidatorsByConfig("GENERIC_PASSWORD");
但在 getValidatorsByConfig Instance<GenericValidator<T>>
delegators 中是一个空集合,我不知道为什么。我缺少什么?
替换
@Inject
private Instance<GenericValidator<T>> delegators;
与:
@Any
@Inject
private Instance<GenericValidator<?>> delegators;
然后Instance injection就能注入你GenericValidator
的所有实现,然后你可以用GenericValidator.getConfigurationCode
到select合适的类型,或者用Instance.select(TypeLiteral<MyConcreteType>{})
到 select 适当的具体类型