我一直在这里搜索,但没有找到答案。
在我的应用程序中,我的控制器有一个抽象主类,其中包含一些方法和属性。我想自动注入 DAO。
abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> {
@Inject
private D dao;
// getters and setters
}
abstract class AbstractDAO<E extends AbstractEntity> {
@PersistentContext
private EntityManager em;
// finds returns E
}
// implemenation/usage
class CarController extends AbstractController<Car, CarDAO> {
}
获取异常:
org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao
使用:Glassfish 3.1 和 JSF 2.1。
有解决方法或替代方案吗?
谢谢。
反射通过源中的泛型声明检测正确的运行时类型并转换为它在技术上非常复杂。 Weld 根本不支持也不会支持它。
最好声明反对
AbstractDAO<E>
:
private AbstractDAO<E> dao;
无论如何,声明反对
D
你不会获得任何好处。
Weld 是 CDI 规范的一种实现,规范禁止在注入点中使用类型变量。
如果你不关心CDI规格,可以看看这个焊接PR。