2012-04-27 55 views
11

我有以下代码来管理两种类型的存储库。这两个存储库类都继承了一个接口,以允许重新初始化其资源。类型[...]的不满意的依赖关系,在注入点使用限定符[@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; 

    ... 
} 

它的工作。然而,增加@StatefulUserRepository类时,部署失败,异常一句话:

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的

  1. 为什么没有如预期这方面的工作? UserRepository var应该已经确定要实例化哪个类,不是吗?这是什么逻辑?
  2. 为什么@Stateful EJB注释在这里有如此严重的影响?为什么它本质上迫使我在var声明中使用CachingRepository接口?

注意,我使用Seam 3面使得@ViewScoped成为CDI视图作用域的bean,所以手头上的问题很可能仍然CDI-只

+0

哦,顺便说一句,这似乎已经在一定程度上回答了这里之前http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac,但为什么“如果你使用EJB,你不能再使用该实现”?这背后的逻辑是什么?为什么不可能呢?这个惯例似乎存在,但为什么呢? – Kawu 2012-04-27 07:25:05

+0

正如我写的,我看不出有任何意义上,它这一点,我很高兴,这是不可能的了,所以我不能帮助但─) – 2012-04-27 09:10:40

+0

你知道你需要'@ Named'当且仅当您需要用于CDI托管bean的JSF访问?它所做的只是提供一个合格的EL名称,它不会**向CDI托管bean(由beans.xml完成​​)创建一个pojo ... – 2012-04-27 11:52:14

回答

9

我有同样的问题,这个误导的异常...

通过增加@StatefulUserRepository你暴露CachingRepository接口的EJB方法,而不必宣称没有接口视图。将@LocalBean添加到UserRepository以激活无界面视图。请参阅EJB 3.1规范第4.9.8“会话Bean的无接口视图”

bean类必须指定,它暴露了通过其bean类定义或部署描述符无接口视图。以下规则适用:

  • ...
  • 如果bean公开至少一个其他客户端来看,豆 指定,它通过在该 @LocalBean注释的方式暴露了一个无接口视图bean类或部署 描述符。
  • ...

我还指this stackoverflow回答有关无接口视图的详细信息。

+0

不错,正是我需要的,谢谢! – Kawu 2012-05-01 03:45:57

+1

我没有任何EJB。我甚至没有在我的代码中的任何地方使用任何@Default注释。但在Wildfly启动时仍然会抛出这个异常。我搜查了很多,但每个人都在谈论EJB。 – Sujoy 2017-07-03 14:32:21

相关问题