我已经例外了,当我想要一个404页面时,我总是在扔:
@ResponseStatus( value = HttpStatus.NOT_FOUND )
public class PageNotFoundException extends RuntimeException {
我想创建控制器范围的@ExceptionHandler
,它将重新抛出ArticleNotFoundException
(导致错误500)作为我的404异常:
@ExceptionHandler( value=ArticleNotFoundException.class )
public void handleArticleNotFound() {
throw new PageNotFoundException();
}
但它不起作用 - 我仍然有错误500 和Spring日志:
ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...
请注意,我将代码翻译为html,因此响应不能为空或简单的字符串与ResponseEntity
一样。 web.xml
条目:
<error-page>
<location>/resources/error-pages/404.html</location>
<error-code>404</error-code>
</error-page>
来自答案评论的最终解决方案
它不是完全重新投掷,但至少它使用web.xml
错误页面映射,例如PageNotFoundException
@ExceptionHandler( value = ArticleNotFoundException.class )
public void handle( HttpServletResponse response) throws IOException {
response.sendError( HttpServletResponse.SC_NOT_FOUND );
}
答案 0 :(得分:9)
不要抛出异常,而是试试这个:
@ExceptionHandler( value=ArticleNotFoundException.class )
public ResponseEntity<String> handleArticleNotFound() {
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
}
这基本上会返回一个Spring对象,由控制器转换为404。
如果要将不同的HTTP状态消息返回给前端,可以将其传递给另一个HttpStatus。
如果您对使用注释执行此操作不熟悉,只需使用@ResponseStatus注释该控制器方法,并且不要抛出异常。
基本上,如果使用@ExceptionHandler
注释方法,我90%确定Spring希望该方法使用该异常而不抛出另一个异常。通过抛出一个不同的异常,Spring认为异常没有被处理,你的异常处理程序失败了,因此日志中的消息
编辑:
要让它返回特定页面,请尝试
return new ResponseEntity<String>(location/of/your/page.html, HttpStatus.NOT_FOUND);
编辑2: 你应该能够做到这一点:
@ExceptionHandler( value=ArticleNotFoundException.class )
public ResponseEntity<String> handleArticleNotFound(HttpServletResponse response) {
response.sendRedirect(location/of/your/page);
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
}