2009-07-28 12 views
22

Ustawiłem web.xml jak poniżej. Mam również kontroler oparty na adnotacjach, który przyjmuje dowolny wzorzec URL, a następnie przechodzi do odpowiedniego jsp (ustawiłem to w pliku -servlet.xml). Jednak jeśli przejdę do strony, która kończy się .html (i której jsp nie istnieje), nie widzę niestandardowej strony 404 (i zobacz poniżej błąd w dzienniku). Każda strona, która nie kończy się na .html, widzę niestandardową stronę 404.Niestandardowe 404 przy użyciu Spring DispatcherServlet

Jak skonfigurować, aby mieć niestandardową stronę 404 dla dowolnej strony, która przechodzi przez DispatcherServlet?

Chcę również dodać, że jeśli ustawię stronę błędu na statyczną stronę (np. Error.htm), to działa, ale jeśli zmienię ją na jsp (np. Error.jsp), otrzymam wyjątek IllegalStateException. Każda pomoc będzie doceniona.

error log

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) 

kontroler

@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

Spróbuj tego -> http://ekiras.blogspot.in/ 2015/02/custom-error-404-error-page-in-spring-mvc.html –

Odpowiedz

34

Jedną z opcji jest mapowanie wszystkich stron błędów poprzez swoje dyspozytora serwletu.

Utwórz nowy kontroler błędzie http:


@Controller 
public class HTTPErrorController { 

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

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

}

Mapa stron o błędach w web.xml

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

@Stefan Haberl, po co zmieniać post @ Rob, zamiast po prostu opublikować swoją uproszczoną wersję jako nową odpowiedź? – sarnold

+1

Czy ktoś może sprawdzić, czy to rozwiązanie działa? To nie dla mnie (wiosna 3.0.5) – Jason

+0

Ten przykład kodu jest prawie dosłowny z niektórych naszych aplikacji i działa zgodnie z oczekiwaniami. Jaki masz problem? Mogę pomóc w debugowaniu. –