2011-12-13 97 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。學習到教訓了! –