泛型类型的依赖注入:生产者无法识别

时间:2016-04-29 19:55:40

标签: java generics cdi weld

情况: 我有一个Entity接口,一些实体实现和一个Repository接口,我希望通过以下方式生成 CDI 的可注入实例:

@Inject @Generic
private Repository<Product, Long> repository;

在初始化 Weld 容器期间(我使用Weld-SE 2.3.4 Final),我得到一个异常,表明我的生产者未被识别为匹配注入点

java.lang.ExceptionInInitializerError
...
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: 
Unsatisfied dependencies for type Repository<Product, Long> with qualifiers @Generic
at injection point [BackedAnnotatedField] @Inject @Generic private idx.contacts.persistence.CDITest.repository

我强烈认为原因在于使用的泛型(两种泛型类型,其中一种(实体类型)依赖于另一种(实体的ID)。 当我改变以使两个泛型类型都是独立的时,一切都运行良好(但对于实体和存储库没有意义)。

Entity界面:

public interface Entity<ID> extends Serializable {
    // some methods
}

此类实体的一个示例:

public class Product implements Entity<Long> {
    // some methods
}

CDI资格赛:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface Generic { }

给定实体类型的Repository接口:

public interface Repository<E extends Entity<ID>, ID> {
    // some methods
}

然后Repository生成器会创建实例,但在此问题的顶部不会被识别为注入示例的合适生产者:

@ApplicationScoped
public class RepositoryProducer {

    @Produces
    @Generic
    public <ID, E extends Entity<ID>> Repository<E, ID> create(
            final InjectionPoint injectionPoint) {
       // would create a repository instance, but is never called
    }
}

CDI与泛型是否仅限于琐碎案例?这甚至可以工作吗?通用类型在代码中保留(未擦除),我使用反射验证了这一点。错误在哪里?

0 个答案:

没有答案