Подтвердить что ты не робот

Пользовательский 404 с помощью Spring DispatcherServlet

Я установил web.xml, как показано ниже. У меня также есть контроллер на основе аннотаций, который принимает любой шаблон URL-адреса и затем переходит к соответствующему jsp (я установил его в -servlet.xml). Однако, если я перехожу на страницу, которая заканчивается на .html(и чья jsp не существует), я не вижу пользовательскую страницу 404 (и вижу ошибку ниже в журнале). Любая страница, которая не заканчивается на .html, я вижу пользовательскую страницу 404.

Как я могу настроить, чтобы пользовательская страница 404 для любой страницы, проходящей через DispatcherServlet?

Также хочу добавить, что если я установлю свою страницу ошибок на статическую страницу (т.е. error.htm), она будет работать, но если я изменю ее на jsp (т.е. error.jsp), я получу исключение IllegalStateException. Любая помощь будет оценена.

ошибка журнала

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)

контроллер

@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>
4b9b3361

Ответ 1

Один из вариантов - сопоставить все страницы ошибок с помощью сервлета диспетчера.

Создать новый контроллер ошибок HTTP:


@Controller
public class HTTPErrorController {

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

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

}

Сопоставьте страницы ошибок в web.xml

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