mem*_*und 10 java dependency-injection java-ee cdi
我有一个通用的抽象模板类.我想如果我创建特定于类型的生成器,我可以直接在泛型类中注入一些DAO服务.但我不能.
为什么?我怎么能解决这个问题呢?
abstract class MyView<T> {
@Inject
MyDao<T> dao;
//some more template methods that make use of the dao
void someMethod() {
dao.use();
}
}
class CustomerView extends MyView<Customer> {
//javax.enterprise.inject.AmbiguousResolutionException: Ambigious resolution
}
class DaoManager {
@Produces
MyDao<Customer> getDaoCustomer() {
return DaoFactory.make(Customer.class);
}
@Produces
MyDao<Product> getDaoProduct() {
return DaoFactory.make(Product.class);
}
}
Run Code Online (Sandbox Code Playgroud)
当我注射例如@Inject MyDao<Customer> dao;它它完美地工作.但不是泛型......
当你要求
@Inject MyDao<Customer> dao;
Run Code Online (Sandbox Code Playgroud)
容器知道你想要一个特定类型的bean MyDao<Customer>.如果存在这样的bean并且其类型信息是已知的,则容器可以满足注入.例如,类型信息保留在带@Produces注释的方法中
@Produces
MyDao<Product> getDaoProduct() {
Run Code Online (Sandbox Code Playgroud)
容器使用反射来检索参数化类型,并将其与请求的@Inject字段匹配.
同
abstract class MyView<T> {
@Inject
MyDao<T> dao;
Run Code Online (Sandbox Code Playgroud)
但是,所有容器都知道你想要一个MyDao.T是一个类型变量,而不是具体的参数化.容器不能为它采用特定类型.在你的情况下,两个@Producesbean都匹配,并且会有歧义.
在您的示例中,我们从上下文中知道它确实需要一个MyDao<Customer>.这似乎不是你的容器能做的事情,即.尝试将类型参数解析为参数化子类的具体类型参数.
| 归档时间: |
|
| 查看次数: |
7500 次 |
| 最近记录: |