PortletRequest
ポータル アプリケーションから特定の情報を取得する必要があります。これは、ポートレット アプリケーション内のユーティリティ メソッドを使用して行います。この Utility メソッドではFacesContext.getCurrentInstance().getRequest()
、PortletRequest を取得するためにアクセスします。DAO レイヤーでこの Utility メソッドにアクセスします。ここではリクエスト パラメータにアクセスできません。時々うまくいきますが、時々私に与えますNullPointerException
。これについて説明する同様のスレッドを見つけました。彼らは、それが同じリクエストの一部である場合、コンテキストを取得する必要があると述べています。私にとっては、同じリクエストの一部ですが、コンテキストがわかりません。手伝ってくれませんか。
2 に答える
FacesContext.getCurrentInstance() から null の FaceContext を取得している場合、この Thread/Request に対して FacesContext が構築されていません。
失敗したリクエストは、faces 以外のエントリ ポイントから来ていますか? イベントまたはリソース ポートレット リクエストなどですか。その場合、FacesContext は作成されません。
DAO のデータにアクセスするために静的メソッドとスレッド ローカル ストレージに依存するのではなく、PortletRequest から必要なものを抽出し、それをスタックに渡すことを検討する必要があります。FaceContext や PortletRequest などのプレゼンテーション レイヤー アーティファクトを DAO レイヤーと混在させるのは悪い習慣です。
アプリケーションが個別の WAR/JAR ファイルにデプロイされている場合、異なるクラスローダーが使用される可能性があります。JBOSS5 で休止状態の HAR アーカイブ内の FacesContext にアクセスしようとしたときに、同様の問題が発生しました。リフレクション API を使用して成功したソリューションを思いつきました。これを見てください。
アプリケーション全体を 1 つの EAR にバンドルすると、耳全体に対して 1 つのクラスローダーの使用を強制できる場合がありますが、これはアプリケーション サーバー固有のものです。
よろしく