QA@IT

sessionに保持しているオブジェクトの取得方法について

11604 PV

weblogic8.?
Java6
SpringMVC

SpringMVCを使用した既存のプロジェクトがあり、そのコントローラクラスでsession.setAttributeを行っているオブジェクトを
メソッドの引数で持回らずに、コントローラクラス以外(DAOやServiceなど)で呼び出す方法を探しております。

下記サイトを参考にさせていただきthreadlocalを使用する方法を考えましたが、weblogicの下記情報を拝見し使わない方向になりました。
《threadlocal情報》
http://zakato.sblo.jp/article/40375636.html
《weblogic情報》
http://www.oracle.co.jp/events/jpm111109_11/materials/day3/E-14_DL.pdf

何かよい方法がございましたら、ご教示いただければと思います。

回答

SpringMVCを使用したことはありませんが、SpringとWebの組み合わせならばRequestContextHolderクラスを利用すれば取得できると思います。

使用方法は、まずRequestContextListenerクラスをlistenerとしてweb.xmlに登録する。
あとはServiceなどで以下を実行する程度だったはずです。

Object valueInSession = 
RequestContextHolder.getRequestAttributes().getAttribute(name,RequestAttributes.SCOPE_SESSION);
編集 履歴 (1)
  • ご返答ありがとうございます。
    ご提示頂いたRequestContextListenerですが、内部でHttpServretRequestをTreadLocalに登録しているとのことです。
    この場合、TreadLocalを使用した場合と同様にメモリの心配があるのですが、その点は大丈夫なのでしょうか?
    -

やはりThreadLocalを使うのが手っ取り早いと思います。
ServletRequestListener#requestDestroyedでリクエスト処理終了時にThreadLocalに保持されている値もクリアするようにすれば再デプロイをくり返してリークするようなこともありません。
http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequestListener.html#requestDestroyed(javax.servlet.ServletRequestEvent)

編集 履歴 (1)
  • 横からすみません。Appサーバ側でユーザのリクエストを処理するスレッドは毎回同じと限らないため、セッション破棄時にThreadLocal内の値をクリアする動作ではまずくないですか? -
  • 仰るとおり!
    ServlerRequestListener#requestDestroyed()で破棄すべきですね。
    http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequestListener.html#requestDestroyed(javax.servlet.ServletRequestEvent)
    -
  • ご返答ありがとうございます。
    確かに、正しくTreadLocalを破棄すれば良いとは思うのですが、関係者の既にTreadLocalに対する心象が悪いため、今回は見送りたいと思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。