経緯
最近かなりハマった内容を書きます。数年前に開発した Java + struts の Web アプリケーションを最近の環境(Java8 + Tomcat8)へ移行した際のこと。JSP が真っ白のまま何も表示されませんでした。
解析
${TOMCAT_HOME}/logs/localhost.yyyy-mm-dd.log
を見たら、エラーが出ていました。
The method getDispatcherType() is undefined for the type HttpServletRequest
直訳すると「HttpServletRequest
型では getDispatcherType()
メソッドは未定義なんだぜ」ということです。なんでこんなエラーが出たのかというと、
- なぜかサーブレットの jar ファイルを自分のアプリケーションの中に抱え持っていた。
- この jar ファイルが古かった(サーブレット 2.5 の時代のもの)。
- JSP から *.java ファイルの変換は新しい Tomcat がやった(と思っている)。
- *.java から *.class へのコンパイル時は抱え持っていた古いサーブレットの jar ファイルが参照された。
- よって新しいメソッド
getDispatcherType()
が古いサーブレットの jar ファイルでコンパイルできず。
対応
新しい jar に入れ替えた。