我有一些像UserDAO, ProductDAO这样的DAO,没有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();


但这会引发异常:


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


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

更新

我需要这个:

UserDAO user = chooseAndGetRequiredDAO();


因此chooseAndGetRequiredDAO()必须了解UserDAO类型是必需的。它必须寻找现有的DAO,如果找到,则选择UserDAO。我不确定它应该使用reflecton或任何DAO工厂。

最佳答案

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

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

10-06 05:54