SpringFrameworkの練習がてら、こないだから作っている AccessLogFilter を Spring管理に作り直し中。
はじめはFilterに入った時点でBeanFactoryを作ってDI管理にしようかと思っていたんだけど、SpringFrameworkのAPIを探っていたらFilter自体を管理できそうなことを発見。
せっかくなのでやってみることに。
とりあえずログ取りBeanをインターフェイス抽出、Filterにsetterをつけて、生成はSpringにお任せ。
はて・・・?
どうやって Beanを抽入すんだべ?
org.springframework.web.filter.DelegatingFilterProxy というものを発見。
名前からして、Struts-Springの時に使う DelegatingActionProxy と同じような使い方だろうと推測。
設置場所は、web.xml だろうとあたりをつけて、早速設定してみた。
・・・・なにやらエラー。
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
うーん、何でだろうとエラーメッセージを頼りにいろいろググってみたところ、 Filterを SpringFramework で管理するのに ServletContextListener に ContextLoaderListener を登録しておく必要があることが判明。
Webアプリ用の ApplicationContextである、WebApplicationContext を呼び出すのに、内部的に WebApplicationContextUtils を使っているようで、これを使うのにはこの Listener を登録する必要があるみたいです。
というわけで、web.xmlに
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
をつけることで見事に動きました。
ついでだったので requestオブジェクトの文字コード設定フィルタも、Spring付属のものに変更。
これから AccessLogger の内部構造を Spring管理にしますかね~。


コメントする