在注入点使用限定符的类型的不满意依赖(使用带有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并不是真正需要的(目前)。

  1. 为什么这不按预期工作? UserRepository var应该已经识别要实例化的类,不应该吗? 这是什么逻辑?
  2. 为什么@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答案,了解有关无接口视图的更多信息。