使用Spring DispatcherServlet的自定义404

njd*_*per 22 spring annotations web.xml http-status-code-404

我已经设置了如下web.xml.我还有一个基于注释的控制器,它接受任何URL模式,然后转到相应的jsp(我在-servlet.xml中设置了它).但是,如果我转到以.html结尾的页面(并且其jsp不存在),我看不到自定义404页面(并在日志中看到以下错误).任何不以.html结尾的页面,我都可以看到自定义404页面.

如何为通过DispatcherServlet的任何页面配置自定义404页面?

还想添加,如果我将我的错误页面设置为静态页面(即.html.htm)它可以工作,但如果我将其更改为jsp(即错误.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)
Run Code Online (Sandbox Code Playgroud)

调节器

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

public ModelAndView test() {

    ModelAndView modelAndView = new ModelAndView();

    return modelAndView;
}
Run Code Online (Sandbox Code Playgroud)

web.xml中

<servlet>
 <servlet-name>my_servlet</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
Run Code Online (Sandbox Code Playgroud)

...

<servlet-mapping>
    <servlet-name>my_servlet</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

...

<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

小智 34

一种选择是通过调度程序servlet映射所有错误页面.

创建一个新的HTTP错误控制器:


@Controller
public class HTTPErrorController {

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

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

}
Run Code Online (Sandbox Code Playgroud)

在web.xml中映射错误页面

<error-page>
    <error-code>404</error-code>
    <location>/errors/404.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

  • @Andreas请求将去那里,因为您将它映射到servlet层的web.xml中.servlet会将你的404映射到/errors/404.html,然后Spring Controller就能赶上它.Controller不知道它是404,只会获得匹配的请求映射,servlet不知道它将错误拉到Spring,只是将重定向到恰好映射到Spring控制器的Web地址. (2认同)
  • 我实现了这个解决方案,但它导致我们的日志中出现错误"没有找到URI的映射..." (2认同)