在注入点使用限定符的类型的不满意依赖(使用带有CDI的@Stateful EJB)
我有以下代码来管理两种存储库。 两个存储库类都inheritance了一个接口,以允许重新初始化其资源。
public interface CachingRepository { public void invalidateCache(); }
全局,应用程序范围的回购:
@Named("globalRepo") @ApplicationScoped public class GlobalRepository implements CachingRepository { private List categories; ... @Override public void invalidateCache() { categories = null; } ... }
每个用户,会话范围的回购:
@Named("userRepo") @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List 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;
我可能在这里需要子类function,所以使用CachingRepository
并不是真正需要的(目前)。
问 :
- 为什么这不按预期工作?
UserRepository
var应该已经识别要实例化的类,不应该吗? 这是什么逻辑? - 为什么
@Stateful
EJB注释在这里有如此严重的影响? 为什么它本质上迫使我在var声明中使用CachingRepository
接口?
注意 ,我使用Seam 3 Faces使@ViewScoped
成为CDI视图范围的bean,因此手头的问题可能仍然只是CDI 。
我对这个误导性的例外有同样的问题……
通过将@Stateful
添加到UserRepository
您可以公开CachingRepository
接口的EJB方法,而无需声明无接口视图。 将@LocalBean
添加到UserRepository
以激活无界面视图。 请参阅EJB 3.1规范,第4.9.8节“会话Bean的无接口视图”
bean类必须指定它通过bean类定义或部署描述符公开无接口视图。 以下规则适用:
- …
- 如果bean公开至少一个其他客户端视图,则bean通过bean类或部署描述符中的@LocalBean批注指定它公开无接口视图。
- …
我还参考了这个stackoverflow答案,了解有关无接口视图的更多信息。