2013-02-07 3 views
0

Ma plate-forme actuelle est NB 7 rc 1 et j'ai une application JSF 2 avec un seul "bean géré". Avec le temps, j'utilise Tomcat 7.0.34.externalContext.getSession (false) renvoie la valeur null

Voici le code où l'erreur se produit:

@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"); 
    } 

Et après traitement de la demande, la routine appelle une vue comme ceci:

  <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> 

Cependant, la vue est pas affichée et cette une erreur se produit:

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

Quelqu'un peut-il m'aider? Merci!

Répondre

4

De votre méthode doInit(),

getExternalContext().getSession(false); 

Cela renvoie null si la session est actuellement pas encore été créé. Mais vous attendez explicitement une session non-null dans la ligne suivante.

Vous devez passer true pour déclencher l'autocreate.

getExternalContext().getSession(true); 

Voir aussi la (Souligné par l'auteur) javadoc:

Si le paramètre create est true, créer (si nécessaire) et renvoyer une instance de session associée à la demande actuelle. Si le paramètre create est false, renvoyez une instance de session existante associée à la demande en cours, ou renvoyez null si une telle session n'existe pas.


au Unrelated problème concret, cette méthode doInit() tout est inutile et peut être remplacé par un @ManagedProperty:

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

Ou, si vous êtes absolument certain que vous avez besoin faites-le dans le doInit(), un moyen plus agréable est de l'obtenir à partir de ExternalContext#getSessionMap() à la place.

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

Vous devriez essayer de éviterjavax.servlet.* les importations dans votre backing bean JSF.

+0

Mais il a été créé avant. Au moment de l'erreur, mon bean géré avait déjà été créé. Donc l'objet de session existait déjà ?? – BicaBicudo

+0

Le bean n'est pas mis dans la portée si les constructeurs (post) ne sont pas finis (JSF ne veut pas mettre un bean cassé dans la portée pour le cas où ils lèvent une exception). Ce n'est que lorsque les constructeurs (post) sont appelés avec succès que le bean est mis dans la portée. Seulement à ce moment-là, la session serait créée si elle n'était pas encore disponible. – BalusC

+0

J'ai choisi l'annotation "ManagedProperty" .... Merci! – BicaBicudo

Questions connexes