【发布时间】: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