我有一些 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();
但它抛出异常:
Exception in thread "main" javax.enterprise.inject.AmbiguousResolutionException: Too many beans match, because they all have equal precedence.
所以问题是我无法使用大量限定符,因为我有很多实体并且可以稍后添加它们。我需要一种通用方法,可以找到并提取具有请求类型的对象,如上面的示例所示。并且它不应该使用类名或任何字符串名称来指示所需的类型或类。例如。 public DAO getNeededDAO(String neededClassName)
。它必须动态检测所需的类型/类。可以吗?
更新
我正是需要这个:
UserDAO user = chooseAndGetRequiredDAO();
因此,chooseAndGetRequiredDAO()
必须了解 UserDAO 类型是必需的。它必须查找现有的 DAO,如果找到则选择 UserDAO。也许它应该使用反射或任何 DAO 工厂,我不确定。
最佳答案
您的 allDAOs
字段允许您执行 programmatic lookup在其类型集中具有 DAO 类型的所有 bean 上。
但要进行查找,您必须发出搜索请求。在这种特殊情况下,类型和限定符的组合。
UserDAO user = allDAOs.select(UserDao.class).get();
关于java - 从注入(inject)的实例 CDI 获取准确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556008/