使用带有泛型类型的@Inject

时间:2011-10-21 23:12:00

标签: jsf-2 glassfish cdi

我一直在这里搜索,但我没有找到答案。

在我的应用程序中,我为我的控制器提供了一个抽象的主类,包含一些方法和属性。我想自动注入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。

为此存在替代方案吗?

感谢。

1 个答案:

答案 0 :(得分:2)

在技术上,反射通过源中的泛型声明检测正确的运行时类型并强制转换为非常复杂。 Weld根本不会也不会支持它。

最好针对AbstractDAO<E>声明:

private AbstractDAO<E> dao;

无论如何,你对D宣告它没有任何好处。