以下のように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>
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>