带ResponseBody的ExceptionHandler:在方法体中设置ResponseStatus

时间:2013-09-02 14:42:18

标签: java spring spring-mvc exception-handling

我有一个方法来处理Spring MVC环境中的特定异常类。 metod(简化)实现遵循

@ExceptionHandler(AjaxException.class)
@ResponseStatus(value=HttpStatus.BAD_REQUEST)
@ResponseBody
public Exception handleException(AjaxException ex) {
    return ex;
}

这样可以正常工作,但要返回不同的ResponseStatus,我必须创建一个新的处理方法。

是否可以更改方法体内的响应状态而不是使用@ResponseStatus注释而不更改返回类型?

如果没有,是否有可能实现改变返回类型的相同结果(可能是我自己序列化异常类并将其作为字符串返回)?

2 个答案:

答案 0 :(得分:4)

HttpServletResponse添加到方法签名中,只需调用setStatus方法。

@ExceptionHandler(AjaxException.class)
@ResponseBody
public Exception handleException(AjaxException ex, HttpServletResponse response) {
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    return ex;
}

这样的事情应该有用。

答案 1 :(得分:2)

轻松完成,仔细阅读弹簧文档。

可以将HttpServletResponse作为对象参数传递。在这样的对象中可以设置返回码。语法如下:

@ExceptionHandler(AjaxException.class)
@ResponseBody
public AjaxException handleException(AjaxException ex,HttpServletResponse response) {
            //test code ahead, not part of the solution

            //throw new NullPointerException();

            //end of test code


    response.setStatus(404);//example
    return  ex;
}

这将返回异常的json序列化以及指定的http返回码。

修改: 我昨天删除了这个答案,因为这个解决方案似乎没有用。问题有点棘手:当您以这种方式管理异常时,如果使用ExceptionHandler注释的方法会抛出异常,则忽略抛出的异常并抛出原始异常。

我的代码在某种程度上就像我发布的解决方案(它在方法的开头引发了异常),所以我看不到json输出,而是触发了标准的spring异常处理程序。要解决这个问题,我只需尝试捕捉异常抛出的行,一切正常。