2009-07-28 10 views
22

Ich habe web.xml wie folgt eingerichtet. Ich habe auch einen annotierungsbasierten Controller, der jedes URL-Muster aufnimmt und dann zum entsprechenden jsp geht (ich habe das in der -servlet.xml eingerichtet). Wenn ich jedoch zu einer Seite gehe, die mit .html endet (und deren Jsp nicht existiert), sehe ich die benutzerdefinierte 404-Seite nicht (und sehe den folgenden Fehler im Protokoll). Jede Seite, die nicht in .html endet, kann die benutzerdefinierte 404-Seite sehen.Benutzerdefinierte 404 mit Spring DispatcherServlet

Wie kann ich eine benutzerdefinierte 404-Seite für jede Seite konfigurieren, die das DispatcherServlet durchläuft?

Auch möchte ich hinzufügen, dass, wenn ich meine Fehlerseite auf eine statische Seite (dh. Error.htm) es funktioniert, aber wenn ich es zu einem JSP (dh. Error.jsp) ändern, bekomme ich die IllegalStateException. Jede Hilfe wäre willkommen.

Protokollfehler

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) 

Controller

@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

Versuchen Sie, diese -> http://ekiras.blogspot.in/ 2015/02/custom-error-404-fehler-page-in-spring-mvc.html –

Antwort

34

Eine Möglichkeit ist, alle Ihre Fehlerseiten durch Ihren Dispatcher Servlet abzubilden.

Erstellen Sie einen neuen HTTP-Fehler-Controller:


@Controller 
public class HTTPErrorController { 

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

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

}

Ordnen Sie die Fehlerseiten in web.xml

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

@Stefan Haberl, warum ändere @ Robs Beitrag, anstatt einfach deine vereinfachte Version als neue Antwort zu posten? – sarnold

+1

Kann jemand bestätigen, dass diese Lösung funktioniert? Es ist nicht für mich (Frühling 3.0.5) – Jason

+0

Dieses Codebeispiel ist fast wörtlich aus einigen unserer Anwendungen und funktioniert wie erwartet. Welches Problem hast du? Ich kann helfen, zu debuggen. –

Verwandte Themen