2011-12-13 98 views
0

我试图用(@SessionScoped)在有状态ejb中注入默认(@Dependent)作用域的无状态ejb。在有状态EJB中注入无状态EJB不能按预期工作

StatelessBean.java

@Stateless 
@LocalBean 
public class StatelessBean implements Serializable { 

    private static final long serialVersionUID = -9166485686181431397L; 

    private long stamp; // + getter/setter 

    public StatelessBean() { 
     super(); 
    } 

    @PostConstruct 
    void init() { 
     setStamp(new Random().nextLong()); 
     System.out.println("Created stateless " + getStamp()); 
    } 

} 

StatefulBean.java

@SessionScoped 
@Named("bean") 
@Stateful 
@LocalBean 
public class StatefulBean implements Serializable { 

    private static final long serialVersionUID = 8358897101178976319L; 

    @Inject 
    private StatelessBean statelessBean; // + getter/setter 

    @PostConstruct 
    void init() { 
     System.out.println("Created stateful " + new Random().nextLong()); 
    } 

    public long getStamp() { 
     return getStatelessBean().getStamp(); 
    } 

} 

scope.xhtml

. 
. 
. 
<h:body> 
    <h:outputText value="#{bean.stamp}" /> 
</h:body> 
</html> 

正如我理解过程rstand,

  1. 您不能在无状态bean上指定范围,除了@dependent。
  2. 如果注入@dependent范围对象,它将遵循客户端生命周期。它永远不会共享。

所以,我期待每一个会话,容器将注入不同的StatelessBean。但它似乎在所有会议中都注入了相同的一个。

任何帮助,为什么发生这种情况?

我正在使用GlassFish 3.1。

谢谢。

回答

0

我认为你的问题是你的无状态bean并不是无状态的。容器可以自由地重用它,因为它应该是无状态的,但是你认为这是一个错误。

+0

@convener感谢您的回复。但我现在认为,这个问题本身可能是无关紧要的。我最近读了(不记得在哪里)CDI是有状态的豆。无状态bean将总是像没有CDI一样运行。我想,应该记住,你只有一种方法调用无状态bean,有或没有CDI。学习到教训了! –