8

我有一种方法可以在 Spring MVC 环境中处理特定类别的异常。方法(简化)实现如下

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

这很好用,但要返回一个不同的ResponseStatus我必须创建一个新的处理方法。

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

如果不是,是否可以通过更改返回类型来实现相同的结果(可能自己序列化异常类并将其作为字符串返回)?

4

2 回答 2

5

添加HttpServletResponse到方法签名并简单地调用该setStatus方法。

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

像这样的东西应该工作。

于 2013-09-03T13:16:50.610 回答
2

很简单,仔细阅读 spring 文档。

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 异常处理程序。为了解决这个问题,我只是尝试捕获异常抛出线,一切都很好。

于 2013-09-02T15:24:23.953 回答