【问题标题】:Java CDI instance inject on generic typeJava CDI 实例注入泛型类型
【发布时间】:2018-05-23 12:31:21
【问题描述】:

我想编写可以在运行时注入的通用验证器对象,选择一个具体类型的 bean 进行验证,但我无法让注入工作。以下是接口类:

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;
    }
}

然后我实现了一个带有这样的字符串引用的具体类:

@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&lt;GenericValidator&lt;T&gt;&gt; 委托人内部是一个空集合,我不知道为什么。我错过了什么?

【问题讨论】:

    标签: java cdi inject generic-type-argument


    【解决方案1】:

    替换

    @Inject  
    private Instance<GenericValidator<T>> delegators;
    

    与:

    @Any 
    @Inject 
    private Instance<GenericValidator<?>> delegators;
    

    那么Instance注入就能注入你GenericValidator的所有实现,然后你可以用GenericValidator.getConfigurationCode选择合适的类型,或者用Instance.select(TypeLiteral&lt;MyConcreteType&gt;{})选择合适的具体类型

    【讨论】:

    • 谢谢,我可以通过这种方式检索实现,但现在我无法调用 validate,因为它期望有一个 T;编译时的错误是 GenericValidator 类型的方法 validate(capture#1-of ?) 不适用于参数(String)。所以我改变了一点方法 getConfigurationCode 类型转换验证器循环变量。有没有机会避免类型安全警告?
    猜你喜欢
    • 2012-04-30
    • 2013-09-18
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多