0

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

有人能帮我吗?谢谢!

4

1 回答 1

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

您应该尽量避免 javax.servlet.*在您的 JSF 支持 bean 中导入。

于 2013-02-07T18:46:23.347 回答