【问题标题】:Using @Inject with generic type使用泛型类型的@Inject
【发布时间】:2011-10-21 23:11:59
【问题描述】:

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

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

是否有解决方法或替代方法?

谢谢。

【问题讨论】:

  • D 是 EJB(托管 bean)吗?
  • 使用 EJB 会话托管 bean(无状态或有状态),我可以使用 InitialContext.lookup 将实例获取到 get 方法中。但我想使用像@Dependent 这样的注入。你有更好的主意吗?
  • Guice 能够处理这种事情。
  • 现在,我将这些 DAO 用作有状态会话 bean,并通过上下文查找获取实例。

标签: jsf-2 glassfish cdi


【解决方案1】:

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

最好针对AbstractDAO&lt;E&gt;声明它:

private AbstractDAO<E> dao;

无论如何,声明它反对D,你将一无所获。

【讨论】:

  • 我可以通过 Weld 使用 lookup/newInstance/... 按类名获取实例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多