2013-08-27 82 views
0

我使用CDI來註釋bean。一個叫豆持有SessionManager與申報logined用戶信息:JSF注入sessionscoped bean的方法調用變爲空指針

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 
import javax.ejb.Stateful; 

@Stateful 
@Named 
@SessionScoped 
public class SessionManagerImpl implements SessionManager, Serializable { 
    ... 
    public UserDto getLoginedUser() { 
     ... 
    } 
} 

,另一種是所謂的DashboardController爲:

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 
import javax.inject.Inject; 

@Named 
@RequestScoped 
public class DashboardController implements Serializable { 

    @Inject 
    private SessionManager sessionManager; 
    ... 
    public void loadUserInfo() { 
     ... 
     UserDto userDto = sessionManager.getLoginedUser(); 
    } 
} 

我第一次打開一個頁面是指DashboardController,它工作得很好。如果我繼續使用該網站,它仍然有效。但是,如果我不點擊任何頁面幾分鐘,然後回來打開頁面,它將顯示javassist $$ getLoginedUser方法調用的空指針(當我使用調試進行監視時,sessionManager不爲空)。會話仍然有效,因爲我可以直接使用faces上下文從會話映射中獲取值。

SessionManager有什麼問題?謝謝。

+1

我相信你在混合一些基本概念,導致災難。我建議仔細閱讀下面的答案,以獲得一個和其他直:http://stackoverflow.com/a/13012973和http://stackoverflow.com/a/8889612/ – BalusC

+0

@BalusC謝謝你的解釋!我確實將有狀態會話與Web會話混合在一​​起。 –

回答

1

發生這種情況是因爲您的有狀態會話Bean(EJB)已鈍化,並且未重新引入到會話中。如果沒有強烈的需求使會話bean的會話作用域對象,我只會將其設置爲SessionScoped託管bean。