externalContext.getSession(false)返回null

时间:2013-02-07 18:39:28

标签: jsf managed-bean

我目前的平台是NB 7 rc 1,我有一个只有一个“托管bean”的JSF 2应用程序。最后,我正在使用Tomcat 7.0.34。

以下是发生错误的代码:

 @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

有人能帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

使用doInit()方法

getExternalContext().getSession(false);

如果当前尚未创建会话,则返回null。但是你明确地期待下一行中的非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辅助bean中避免 javax.servlet.*导入。