VelocityServletのエラー画面

例えばvmファイルが無い等によってエラーになると、スタックトレースがダラダラ表示されたエラー画面が表示される。「VelocityViewServlet : Error processing」でググってみると、そんな恥ずかしいエラー画面がたっぷり出てくる。

これではイカンというわけでカスタムエラーページを設定したいのだが、どうやらこのエラー画面はVelocityViewServlet#error()にハードコーディングされているようなので、このerrorメソッドをオーバーライドするしかないっぽい…。errorメソッド内でServletExceptionを投げるか、レスポンスにステータスコードを設定すればいいんじゃなかろうか。

public class CustomVelocityViewServlet extends VelocityViewServlet {
  protected void error(
    HttpServletRequest request, 
    HttpServletResponse response, 
    Exception e) throws ServletException {
  
    if (e instanceof ResourceNotFoundException) {
      try {
        response.sendError(404, request.getRequestURI());
      } catch (IOException ignore) {
        throw new ServletException(e);
      }
    } else {
      throw new ServletException(e);
    }
  }
}

web.xmlでerror-pageを設定する。

<error-page>
    <error-code>404</error-code>
    <location>/error/notFound.html</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error/serverError.html</location>
</error-page>

VelocityLayoutServlet

VelocityLayoutServletというのがあるらしい。これを使うのが正解なんだろうなあ…