繁体   English   中英

externalContext.getSession(false)返回null

[英]externalContext.getSession(false) returns null

我当前的平台是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

有人能帮我吗? 谢谢!

在您的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()执行此操作, doInit()好的方法是从ExternalContext#getSessionMap()获取它。

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

您应该尝试避免在JSF支持bean中导入javax.servlet.*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM