13

フィルタ内でFacesContextを取得するにはどうすればよいですか?

でを取得する方法については、次の記事に従いFacesContextましたFilter

http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/

ただし、問題は、Flashスコープで機能しないことです。次のNPEがスローされます。

java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751)
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112)

フィルタにリダイレクトを追加し、フラッシュスコープを使用して一部のデータとメッセージを保存したいのですが、機能していません。

4

1 に答える 1

23

フィルタ内でFacesContextを取得するにはどうすればよいですか?

それはいけません。はFacesContextによって作成されるためFacesServlet、によって処理されるJavaコード内でのみ使用できます。これはFacesServlet、マネージドBeanやフェーズリスナーなどのすべてのJSFアーティファクトを対象としています。この記事では、を手動で作成する方法のみを示していますがFacesContext、このアプローチは最終的には役に立ちません。これは、、、などのFacesContext標準サーブレットAPIですでに利用可能なすべてのものを抽象化したものです。JSFが「内部」で行っているのと同じ方法で直接使用してください。HttpServletRequestHttpSessionServletContext

2つのオプションがあります:

  1. PhaseListener代わりにJSFを使用してください。何も言わなかった具体的な機能要件によっては、これはかなり不器用な解決策/回避策になる可能性があります。

  2. JSFが提供するFlashスコープ機能は使用せず、自分で自作してください。原則はかなり単純です。最初のリクエストでCookieを設定し、リダイレクトを送信し、リダイレクトされたリクエストでCookie検索して削除します(その後のリクエストではCookieが存在しないようにします)。これが、JSFFlashスコープが内部でどのように機能するかを示しています。具体的な例については、 sendRedirectの後に表示される要求属性として通知メッセージを設定するも参照してください。

于 2012-12-26T21:04:05.480 に答える