Ein Wort vorab: Wenn Sie nur eine "statische" Fehlerseite ohne viel Logik und Modellvorbereitung benötigen, sollte es ausreichen, einen <error-page>
-Tag in Ihre web.xml
zu setzen (siehe unten für ein Beispiel).
Andernfalls könnte es bessere Möglichkeiten, dies zu tun, aber das funktioniert für uns:
Wir verwenden ein Servlet <filter>
im web.xml
, die alle Ausnahmen abfängt und ruft unsere eigene Fehlerbehandler, die gleichen wir im Inneren des Frühlings verwenden 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>
Die Umsetzung sieht im Wesentlichen wie folgt aus:
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");
}
// ...
}
Ich glaube, das sollte für Freemarker Vorlagen so ziemlich das gleiche Arbeit. Natürlich, wenn Ihre Fehleransicht einen Fehler verursacht, sind Sie mehr oder weniger aus Optionen.
Um auch Fehler wie 404 und bereiten das Modell für ihn zu fangen, verwenden wir einen Filter, der auf die ERROR
Dispatcher zugeordnet ist:
<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>
Die doFilter-Implementierung sieht wie folgt aus:
@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);
}
Würde so [Konfiguration] (http://developingdeveloper.wordpress.com/2008/03/09/handling-exceptions-in-spring-mvc-part-2/) helfen? – nobeh
@nobeh Nein, leider nicht. Dieser Artikel erklärt einfach die Verwendung des HandlerExceptionResolver-Zeugs. Das verwende ich bereits, aber es erfasst nur Ausnahmen, die in Controllern und nicht in Ansichten ausgelöst werden. – kayahr