web-dev-qa-db-ja.com

SpringDispatcherServletを使用したカスタム404

以下のようにweb.xmlを設定しました。また、任意のURLパターンを取り込んで対応するjspに移動するアノテーションベースのコントローラーもあります(これは-servlet.xmlで設定しました)。ただし、.htmlで終わる(そしてjspが存在しない)ページに移動すると、カスタム404ページが表示されません(ログに以下のエラーが表示されます)。 .htmlで終わらないページは、カスタム404ページを見ることができます。

DispatcherServletを通過するページにカスタム404ページを設定するにはどうすればよいですか?

また、エラーページを静的ページ(つまり、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>
22
njdeveloper

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>
34
Rob Beardow