【问题标题】:Get exact object from injected instance CDI从注入的实例 CDI 中获取准确的对象
【发布时间】:2016-02-22 14:20:27
【问题描述】:

我有一些 DAO,例如 UserDAO, ProductDAO 等,没有 cdi 注释或限定符(那时它们是 @Default)。这些类实现了抽象 DAO:

public interface DAO {
    void update();
    void delete();
    void getById(long id);
}

所以我收到了所有可用的 DAO 实现:

public class ClassToInjectIn {
    @Inject
    private Instance<DAO> allDAOs;
}

现在allDAOs 包含以下内容:

[UserDAO, {@Default(), @Any()}]
[ProductDAO, {@Default(), @Any()}]

例如,我需要从这个实例中获取 UserDAO,但我不能。 我想这样做:

UserDAO user = allDAOs.get();

但它会抛出异常:

线程“main”中的异常 javax.enterprise.inject.AmbiguousResolutionException:太多的bean 匹配,因为它们都有相同的优先级。

所以问题是我不能使用很多限定符,因为我有很多实体,它们可以稍后添加。我需要一种通用方法,它可以找到并提取具有请求类型的对象,如上例所示。并且它不应该使用类名或任何字符串名称来指示所需的类型或类。例如。 public DAO getNeededDAO(String neededClassName)。它必须动态检测所需的类型/类。有可能吗?

更新

我正是需要这个:

UserDAO user = chooseAndGetRequiredDAO();

所以chooseAndGetRequiredDAO() 必须了解 UserDAO 类型是必需的。它必须寻找存在的DAO,如果找到就选择UserDAO。也许它应该使用反射或任何 DAO 工厂,我不确定。

【问题讨论】:

    标签: java dependency-injection cdi


    【解决方案1】:

    您的allDAOs 字段允许您对类型集中具有DAO 类型的所有bean 执行programmatic lookup。 但是要进行查找,您必须提供搜索请求。在这种特殊情况下,类型和限定符的组合。

    UserDAO user = allDAOs.select(UserDao.class).get();
    

    【讨论】:

    • 天哪,原来如此简单。谢谢。
    【解决方案2】:

    无论你是:

    • 使用@Named
    • 注入实际接口,如UserDAO,OrderDAO,...(正确方式)
    • 使用 T build(Class&lt;T&gt;) 方法注入 DAOFactory,您可以像这样在运行时调用 factory.build(User.class).getById(id)(我确实建议这样做)

    【讨论】:

      【解决方案3】:

      如果可以使用通用参数,您也许可以专门化您的 DAO:

      public interface DAO<T> {
         ...
      }
      

      然后,您可以使用泛型参数区分不同的参数。虽然这只适用于 CDI bean,不适用于 EJB(我认为)

      @Inject
      private DAO<User> userDao;
      

      如果你真的想要所有 DAO,你必须迭代allDAOs。在您的示例中:

      for(DAO dao: allDAOs) {
         ...do something with dao...
      }
      

      【讨论】:

      • 请阅读我的更新。而且我不能用确切的类型注入 DAO。
      • 那为什么不直接注入UserDAO呢?否则请参阅select() 的其他帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多