Tomcat 5.5 と Spring 3.2 を使用しています。web.xml デプロイメント記述子には、次の構成があります -
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
原因不明の動作は、以下のような方法で発生します -
public ModelAndView fileDownload(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
String filename = (String) request.getParameter("filename");
//...more code
File file = new File(...+ filename); // pseudo code
OutputStream out = response.getOutputStream();
InputStream stream = new FileInputStream(file); // FileNotFoundException here
//...more code
}
FileNotFoundException が発生すると、エラー ページのレンダリングに使用されたカスタム 500.jsp は表示されませんが、その代わりに、例外のスタック トレース全体がページ上に表示されます。以下のように 2 つのステートメントの順序を単純に逆にすると、
InputStream stream = new FileInputStream(file); // FileNotFoundException here
OutputStream out = response.getOutputStream();
すべてが正しく機能し、ページに正しい 500.jsp がレンダリングされます。
なぜこれが起こるのですか?唯一の違いは、後者の場合、応答オブジェクトの OutputStream が開かれていないことです。