JBOSSとSeasarとTeeda その4

だいぶ時間が空いてしまいましたが、JBOSS移行シリーズ最終回。
もはや少し忘れかけてます。。。


サーブレットコンテナによる細かい仕様の違いなんだけど、
まずはFilterです。

WebLogicではサーブレットフィルターの中で
フォワード(RequestDispatcher#Forward)をすると
フォワード先にかかっているフィルターも呼ばれます。
しかしJBOSSではフォワード先のFilterは呼ばれない。


Tomcat7もJBOSSと同様でした。JBOSSもCatalinaのAPI使ってるしね。
Servlet2.4からWeb.xmlのfilter-mappingに
dispatcher属性が追加されて
フィルターの適用をリクエスト・フォワード・インクルード・エラーの
それぞれのイベントで選択できるようになったけど
WebLogicのバージョンが古いから全部適用になってたっぽい。
2.4移行はデフォルトでリクエストのみの様子。


これのせいでJBOSS環境ではフォワード後に
SeasarのHotdeployFilterが適用されなくて
RequestオブジェクトがDIできずハマった。。。


お次はInputStreamの2度読み。
WebLogicではInputStreamをBufferedInputStreamで
包んであげればmarkメソッドとresetメソッドで
一度お尻まで読み込み終わっても
ストリームの位置を元に戻せるけどJBOSSではできない。
resetが動作しないのでBufferedReader#readLineがnullになる。


その影響だと思うけど、
フォームなどのPOSTリクエストに対して、
SeasarのRequestDumpFilterで
ログを出力した後にInputStreamを使うと読み込めない。。
これはRequestDumpFilterの中で利用している
Request#getParameterNamesのせい。
これをコメントアウトすれば大丈夫!


POSTの場合はパラメータ情報を取得する時に
InputStreamを使ってるんだと思う。
getParameterNamesやgetParameterValue自体は
内部でキャッシュするからか、何度も呼べるけど
InputStreamはダメ。どうしてもやりたい場合は
HttpServletRequestWrapperを使って、
InputStreamをキャッシュしましょう。


あとはWindowsからLinuxへの移行ということで、
SJIS⇒UTF8になり、Byte長が変わって入力チェックや
各種制御を総見直しになったり、
MSゴシックのフォントが使えなくなったり。
まぁ、それはそれは大変でした。


AS7.2~はまだ情報も少ないのがキツかった。

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド