情况:
我有一个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与泛型是否仅限于琐碎案例?这甚至可以工作吗?通用类型在代码中保留(未擦除),我使用反射验证了这一点。错误在哪里?