単語の先頭:多くのロジックとモデルの準備がなくても "静的な"エラーページが必要な場合は、タグをweb.xml
に入れるだけで十分です(下記の例を参照)。
そうでない場合は、そこにこれを行うには良い方法であることが、これは私たちのために働くかもしれません:
私たちは、すべての例外をキャッチし、私たちのカスタムのErrorHandlerを呼び出すweb.xml
でサーブレット<filter>
を使用し、私たちは春の内側に使用するのと同じHandlerExceptionResolver。
<filter>
<filter-name>errorHandlerFilter</filter-name>
<filter-class>org.example.filter.ErrorHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
実装は、基本的に次のようになります。
public class ErrorHandlerFilter implements Filter {
ErrorHandler errorHandler;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
// call ErrorHandler and dispatch to error jsp
String errorMessage = errorHandler.handle(request, response, ex);
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
errorHandler = (ErrorHandler) WebApplicationContextUtils
.getRequiredWebApplicationContext(filterConfig.getServletContext())
.getBean("defaultErrorHandler");
}
// ...
}
私は、これはFreeMarkerのテンプレートのほとんど同じように動作するはずと信じています。もちろん、エラービューでエラーが発生した場合は、多かれ少なかれオプションがあります。また、404のようなエラーをキャッチし、それのためにモデルを準備するために
、我々はERROR
ディスパッチャにマッピングされているフィルタを使用します。
<filter>
<filter-name>errorDispatcherFilter</filter-name>
<filter-class>org.example.filter.ErrorDispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
のdoFilter-実装は次のようになります。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
// handle code(s)
final int code = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (code == 404) {
final String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
request.setAttribute("errorMessage", "The requested page '" + uri + "' could not be found.");
}
// notify chain
filterChain.doFilter(servletRequest, servletResponse);
}
出典
2012-06-28 15:08:59
oxc
このような[構成](http://developingdeveloper.wordpress.com/2008/03/09/handling-exceptions-in-spring-mvc-part-2/)は役に立ちますか? – nobeh
@nobehいいえ、残念ながらではありません。この記事では、HandlerExceptionResolverの使い方について簡単に説明します。これは私がすでに使っているものですが、コントローラで投げられた例外だけをキャプチャし、ビューでは捕獲しません。 – kayahr