2013-02-07 74 views
0

我的當前平臺是NB 7 rc 1,我有一個只有一個「託管bean」的JSF 2應用程序。及時,我正在使用Tomcat 7.0.34。externalContext.getSession(false)返回null

這裏是發生錯誤的代碼:

@ManagedBean 
    @SessionScoped 
    public class CopyController implements Serializable { 
     private static final long serialVersionUID = 1L; 
     private String pathBancoSentencas; 
     private List<Arquivo> arquivosUpload; 
     private HttpSession session; 
     private List<String> listaPdfs; 

     public List<Arquivo> getArquivosUpload() { 
     return arquivosUpload; 
     } 
     public void setArquivosUpload(List<Arquivo> arquivosUpload) { 
     this.arquivosUpload = arquivosUpload; 
     } 

     public CopyController() { 
     arquivosUpload = new ArrayList<Arquivo>(); 
     } 

     @PostConstruct 
     public void doInit() { 
      session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false); 
    pathBancoSentencas = (String)session.getAttribute("DIRETORIO_TRABALHO"); 
    } 

以及處理該請求之後,該例程調用這樣一個觀點:

  <p:dataTable value="#{copyController.arquivosUpload}" var="arquivo" paginator="true" paginatorPosition="bottom" 
         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"> 
       <f:facet name="header"> 
       Item processado 
       </f:facet> 
       <h:column> 
       <h:outputText value="#{arquivo.nome}" /> 
       </h:column> 
      </p:dataTable> 

但是,不顯示的視圖,該發生錯誤:

Caused by: java.lang.NullPointerException 
    at br.jus.tjmg.dspace.copy.CopyController.doInit(CopyController.java:54) 
    ... 70 more 

有人能幫助我嗎? 謝謝!

回答

4

從你doInit()方法,

getExternalContext().getSession(false); 

這將返回null如果會話當前尚未創建。但是,您明確期待下一行中的非會話。

您需要通過true觸發自動創建。

getExternalContext().getSession(true); 

又見javadoc(重點煤礦):

如果create參數true,創建(如果需要),並返回與當前請求相關的會話實例。如果create參數爲false,則返回與當前請求關聯的任何現有會話實例,如果不存在此類會話,則返回或返回null


無關到具體的問題,即整個doInit()方法是不必要的,可以通過@ManagedProperty替代:

@ManagedProperty("#{DIRETORIO_TRABALHO}") 
private String pathBancoSentencas; 

或者,如果你是絕對肯定,你需要對doInit()做一個更好的方法是從ExternalContext#getSessionMap()取而代之。

pathBancoSentencas = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("DIRETORIO_TRABALHO"); 

你應該儘量避免在JSF支持beanjavax.servlet.*進口。

+0

但它是之前創建的。在發生錯誤時,我的託管bean已經創建完畢。 那麼會話對象已經存在了? – BicaBicudo

+0

如果(後)構造函數沒有完成(JSF不希望在它們引發異常的情況下將一個破壞的bean放入作用域),那麼這個bean不會被放入作用域。只有在成功調用(後)構造函數之後,該bean纔會被放入作用域。只有在那一刻,會議纔會被創建,如果還不可用的話。 – BalusC

+0

我選擇了註釋「ManagedProperty」.... 謝謝! – BicaBicudo