Una palabra por adelantado: si solo necesita una página de error "estática" sin mucha lógica y preparación del modelo, debería bastar con poner <error-page>
-Tag en su web.xml
(vea más abajo un ejemplo).
De lo contrario, puede haber mejores maneras de hacer esto, pero esto funciona para nosotros:
se utiliza un servlet <filter>
en el web.xml
que las capturas de todas las excepciones y llama a nuestra costumbre ManejadorError, la misma que utilizamos dentro de la Primavera 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>
La aplicación se ve esencialmente como esto:
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");
}
// ...
}
creo que esto debería funcionar más o menos la misma para las plantillas FreeMarker. Por supuesto, si su vista de error arroja un error, estará más o menos sin opciones.
también para detectar errores como el 404 y el modelo listo para ello, se utiliza un filtro que está asignado a la ERROR
despachador:
<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>
El doFilter-implementación es el siguiente:
@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);
}
¿Ayudaría tal [configuración] (http://developingdeveloper.wordpress.com/2008/03/09/handling-exceptions-in-spring-mvc-part-2/)? – nobeh
@nobeh No, desafortunadamente no. Este artículo simplemente explica el uso de las cosas HandlerExceptionResolver. Eso es lo que ya uso, pero solo captura las excepciones lanzadas en los controladores, no en las vistas. – kayahr