HttpServletRequest が COOL deploy で DI されなくなる
最近また Seasar で悩みまくってる今日この頃。
というわけで、今日はタイトルのような内容で悩みました。
原因はいまだわからず・・・。
HttpServletRequest のヘッダからある値を取得して、それを利用してゴニョゴニョする、みたいなインターセプタを2つ作る必要が出てきたので、下記のようなものを作りました。
Page クラスにかます ForPageInterceptor と、
S2Dao を利用する Dao クラスにかます ForDaoInterceptor みたいなインターセプタです。
ちなみに ForDaoInterceptor は、HttpServletRequest のある特定の値を引っ張って、INSERT および UPDATE の際に Entity の特定のフィールドに値をセットする、みたいなことを行います。
public class ForPageInterceptor extends AbstractInterceptor { HttpServletRequest request; public Object invoke(MethodInvocation invocation) throws Throwable { // request から値を取得してごにょごにょする return invocation.proceed(); } // setter 省略 }
public class ForDaoInterceptor extends AbstractInterceptor { HttpServletRequest request; DaoNamingConvention daoNamingConvention; public Object invoke(MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); Object[] args = invocation.getArguments(); if ((args.length == 1) && (args[0] instanceof AbstractEntity)) { AbstractEntity entity = (AbstractEntity) args[0]; String value = request.getHeader("hogeHeader"); // ある特定のヘッダ値 for (String prefix : daoNamingConvention.getUpdatePrefixes()) { if (method.getName.startsWith(prefix)) { // UPDATE メソッド entity.setCommonValue(value); } } } return invocation.proceed(); } // setter 省略 }
上記のようなインターセプタを作って、customizer.dicon の pageCustomizer / daoCustomizer それぞれにインターセプタをかませるよう記述。
また、creator.dicon の InterceptorCreator には externalBinding を true としておく。
たぶん、ここまではいいと思ってます。
この状態で、HOT deploy な環境で動作テストをしているとちゃんと動いたので、COOL deploy で動かしてみるか〜と動かしてみると・・・ForPageInterceptor には HttpServletRequest が DI されるのに、ForDaoInterceptor には DI されなくなっちゃいました。
トレース取ったりして調べてみたんですが、そもそも ForDaoInterceptor 側の setter が呼ばれてないもよう?
今まで、COOL deploy だと動くのに HOT deploy だと動かない、という現象はよく目にして対処できたんですが、今回はまったく逆なのでわからず・・・。
やっぱり、今まで通り自分が何かおかしなことをやってるのかなあ・・・。