类型 [...] 的未满足依赖关系,在注入点使用限定符 [@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 豆的名称,如
@Inject @Named("userRepo")
private UserRepository userRepo;
导致相同的异常。唯一可以结合使用的是使用 var 声明中的接口:@Stateful
@Inject @Named("userRepo")
private CachingRepository userRepo;
但是,我在这里可能需要子类功能,因此(目前)并不需要使用。CachingRepository
问:
- 为什么这不能按预期工作?var 应该已经标识了要实例化的类,不是吗?这有什么逻辑呢?
UserRepository
- 为什么 EJB 注释在这里有如此严重的影响?为什么它基本上迫使我在var声明中使用接口?
@Stateful
CachingRepository
请注意,我使用Seam 3 Faces使它成为CDI视图范围的Bean,所以手头的问题可能仍然只有CDI。@ViewScoped