2016-02-22 39 views
2

我有一些DAO,如UserDAO, ProductDAO等没有cdi注释或限定符(它们是@Default)。这些类实现了抽象的DAO:从注入的实例中获取确切的对象CDI

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

所以我收到的所有avaliable的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:太多豆 比赛,因为它们都具有相同的优先权。

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

UPDATE

我需要的正是这一点:

UserDAO user = chooseAndGetRequiredDAO(); 

所以chooseAndGetRequiredDAO()要明白,UserDAO的类型是必需的。它必须寻找存在的DAO并且如果发现则选择UserDAO。也许它应该使用反射或任何DAO工厂,我不确定。

回答

2

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

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

我的天啊,它太简单了。谢谢。 – nllsdfx

0

要么你:

  • 使用@Named
  • 注入实际的接口,例如UserDAOOrderDAO,...(正道)
  • 注入DAOFactory与方法T build(Class<T>)你在调用像这样的运行时间factory.build(User.class).getById(id)(我做不是建议这个)
+0

请阅读我的更新。 – nllsdfx

0

也许你可以专注你的DAO,如果这是可能的一个泛型参数:

public interface DAO<T> { 
    ... 
} 

你可能不同的人之间,以与一般的参数,然后进行区分。虽然这仅适用于CDI豆,而不是EJB的(我认为)

@Inject 
private DAO<User> userDao; 

如果你真的想所有的DAO,你必须遍历allDAOs。在您的例子:

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

请阅读我的更新。而且我无法注入精确类型的DAO。 – nllsdfx

+0

为什么不直接注入UserDAO呢?否则,请使用'select()'来查看其他帖子。 –