我有以下代码来管理两种类型的存储库。这两个存储库类都继承了一个接口,以允许重新初始化其资源。类型[...]的不满意的依赖关系,在注入点使用限定符[@Default](使用@Stateful EJB和CDI)
public interface CachingRepository
{
public void invalidateCache();
}
全球,应用程序作用域回购:
@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
private List<Category> categories;
...
@Override
public void invalidateCache()
{
categories = null;
}
...
}
每用户,会话范围回购:
@Named("userRepo")
@SessionScoped
//@Stateful // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
private List<MyFile> files;
@Override
public void invalidateCache()
{
files = null;
}
...
}
在注入这个(不@Stateful
)插入上下文
@Named
@ViewScoped
public class MyHandler implements Serializable
{
@Inject
private UserRepository userRepo;
...
}
它的工作。然而,增加@Stateful
到UserRepository
类时,部署失败,异常一句话:
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
... 5 more
添加CDI bean的名字一样
@Inject @Named("userRepo")
private UserRepository userRepo;
导致相同的异常。在与@Stateful
一起工作的唯一一件事就是使用该接口在var声明:
@Inject @Named("userRepo")
private CachingRepository userRepo;
我可能需要在此子类的功能。不过,这样使用CachingRepository
是不是真正需要的(目前)。
Q的:
- 为什么没有如预期这方面的工作?
UserRepository
var应该已经确定要实例化哪个类,不是吗?这是什么逻辑? - 为什么
@Stateful
EJB注释在这里有如此严重的影响?为什么它本质上迫使我在var声明中使用CachingRepository
接口?
注意,我使用Seam 3面使得@ViewScoped
成为CDI视图作用域的bean,所以手头上的问题很可能仍然CDI-只。
哦,顺便说一句,这似乎已经在一定程度上回答了这里之前http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac,但为什么“如果你使用EJB,你不能再使用该实现”?这背后的逻辑是什么?为什么不可能呢?这个惯例似乎存在,但为什么呢? – Kawu 2012-04-27 07:25:05
正如我写的,我看不出有任何意义上,它这一点,我很高兴,这是不可能的了,所以我不能帮助但─) – 2012-04-27 09:10:40
你知道你需要'@ Named'当且仅当您需要用于CDI托管bean的JSF访问?它所做的只是提供一个合格的EL名称,它不会**向CDI托管bean(由beans.xml完成)创建一个pojo ... – 2012-04-27 11:52:14