- PR -

FilterよりJSFのmanaged-beanのプロパティにアクセスしたい

投稿者投稿内容
つちつち
会議室デビュー日: 2004/10/21
投稿数: 17
投稿日時: 2006-07-29 20:28
こんにちは

JSFの勉強中のつちつちと申します。

FilterよりJSFのmanaged-beanのプロパティにアクセスしたいと思うのですが、
以下の行でエラーが出ます。

FacesContext ctx = FacesContext.getCurrentInstance();
LoginBean mlb = (LoginBean)ctx.getApplication().getVariableResolver().resolveVariable(ctx, "LoginBean");

※エラー内容
java.lang.NullPointerException
tsuchi.filter.imgman01.LoginFilter.doFilter(LoginFilter.java:34)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)

JSFのライフサイクルの関係で、Filterからはプロパティにアクセスできないのでしょうか?

どなたかご教授お願いします。
なにがやりたいかというと、セッション管理をFilterで行ないたいのですが、セッションの有効/無効をmanaged-beanのプロパティに持たせ、Filterを通過するたびに、それをチェックしたいと思っています。。。

よろしくお願いします。

T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2006-07-30 01:39
>JSFのライフサイクルの関係で、Filterからはプロパティにアクセスできないのでしょうか?

そういうことです。Filterは、ServletやJSPがリクエストを処理する前に
実行されるので、FacesServletがリクエストの処理を行っていないということは、
FacesContextのインスタンスも生成されていません。

FacesContext ctx = FacesContext.getCurrentInstance();

この時点で、ctxにはnullが入ってくるはずです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-07-30 01:46
引用:

つちつちさんの書き込み (2006-07-29 20:28) より:
JSFのライフサイクルの関係で、Filterからはプロパティにアクセスできないのでしょうか?


FacesContext.getCurrentInstance()が返すコンテキストは、FacesServletが
ThreadLocalに構成するので、FacesServletより前に実行されるFilterからでは
使うことはできません。

普通にServletRequestを使ってmanaged-beanにアクセスしましょう。
インスタンスの生成も必要なのであれば、自分でnewする必要があります。
これはmanaged-beanの生成がJSF ELの評価中に行われるからです。
つちつち
会議室デビュー日: 2004/10/21
投稿数: 17
投稿日時: 2006-07-31 09:10
こんにちは

T2さん、あしゅさん、アドバイスありがとうございました。
FilterからのManaged-beanプロパティへのアクセスはあきらめたいと思います。

ありがとうございました。
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-07-31 09:15
マネージドビーンをセッションスコープに指定して、下記のように普通に取り出せませんか?

managedBean = (ManagedBean)session.getAttribute(MANAGED_BEAN_NAME);
chaguma
会議室デビュー日: 2006/03/10
投稿数: 8
投稿日時: 2006-07-31 17:06
マネージドビーンのなまえがhogeで
スコープがセッションの場合

HogeBean hogeBean = (HogeBean) session.getAttribute("hoge");

とか
どうでしょうか
つちつち
会議室デビュー日: 2004/10/21
投稿数: 17
投稿日時: 2006-08-01 13:08
chaguma様、TAKEZO様
コメントありがとうございます。

確認してみようと思うのですが、1点分からないところがあります。

 session.getAttribute("hoge");

の部分がありますが、「session」はどのように定義したらよいのでしょうか?


HttpSession session = (HttpSession)???;

???の部分を何らかの形にするのでしょうか?
何度も申し訳有りませんが、アドバイスをお願いいたします。

TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-08-01 13:29
FilterのdoFilterメソッド内で下記のように記述すれば取れると思います。

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

HttpSession session;
HttpServletRequest sreq;

sreq = (HttpServletRequest)req;
session = sreq.getSession();

以下略

スキルアップ/キャリアアップ(JOB@IT)