0

私の現在のプラットフォームはNB7rc 1で、「マネージドBean」が1つだけのJSF2アプリがあります。やがて、私はTomcat7.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(必要に応じて)作成し、現在のリクエストに関連付けられているセッションインスタンスを返します。パラメータcreatefalse現在のリクエストに関連付けられている既存のセッションインスタンスを返す場合、またはその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.*

于 2013-02-07T18:46:23.347 に答える