如何在Spring @ExceptionHandler中将异常重新抛出为@ ResponseStatus注释异常?

时间:2014-04-15 07:47:46

标签: java spring exception spring-mvc exception-handling

我已经例外了,当我想要一个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 );

    }

1 个答案:

答案 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);
}