2009-07-28 13 views
22

He configurado web.xml como a continuación. También tengo un controlador basado en anotaciones, que toma cualquier patrón de URL y luego va al jsp correspondiente (lo he configurado en -servlet.xml). Sin embargo, si voy a una página que termina en .html (y cuya jsp no existe), no veo la página 404 personalizada (y veo el error a continuación en el registro). Cualquier página que no termine en .html, puedo ver la página 404 personalizada.Personalizado 404 usando Spring DispatcherServlet

¿Cómo puedo configurar para tener una página 404 personalizada para cualquier página que pase por DispatcherServlet?

También quiero agregar que si configuro mi página de error en una página estática (es decir, error.htm) funciona, pero si la cambio a jsp (es decir, error.jsp), obtengo la IllegalStateException. Cualquier ayuda sería apreciada.

error del registro de

Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response 
at org.apache.catalina.connector.Response.getWriter(Response.java:606) 
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195) 
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124) 

controlador

@RequestMapping(value = {"/**"}) 

public ModelAndView test() { 

    ModelAndView modelAndView = new ModelAndView(); 

    return modelAndView; 
} 

Web.xml

<servlet> 
<servlet-name>my_servlet</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
</servlet> 

...

<servlet-mapping> 
    <servlet-name>my_servlet</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

...

<error-page> 
    <error-code>404</error-code> 
    <location>/error.html</location> 
</error-page> 
+0

Prueba este -> http://ekiras.blogspot.in/ 2015/02/custom-error-404-error-page-in-spring-mvc.html –

Respuesta

34

Una opción es mapear todas sus páginas de error a través de su servlet despachador.

Crear un nuevo controlador de error HTTP:


@Controller 
public class HTTPErrorController { 

    @RequestMapping(value="/errors/404.html") 
    public String handle404() { 
     return "errorPageTemplate"; 
    } 

    @RequestMapping(value="/errors/403.html") 
    ... 

}

en el mapa los páginas de error en web.xml

<error-page> 
    <error-code>404</error-code> 
    <location>/errors/404.html</location> 
</error-page>
+0

@Stefan Haberl, ¿por qué cambiar la publicación de @ Rob en lugar de simplemente publicar su versión simplificada como una nueva respuesta? – sarnold

+1

¿Alguien puede verificar que esta solución funciona? No me sirve (Spring 3.0.5) – Jason

+0

Este ejemplo de código es casi textual de algunas de nuestras aplicaciones y funciona como se espera. ¿Qué problema estás teniendo? Puedo ayudar a depurar. –

Cuestiones relacionadas