当前位置: 首页 > 知识库问答 >
问题:

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

胡致远
2023-03-14

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

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

这很好,但是要返回不同的响应状态我必须创建一个新的处理方法。

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

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

共有2个答案

赵夕
2023-03-14

很容易做到,请仔细阅读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异常处理程序。为了解决这个问题,我简单地尝试了一下异常抛出行,一切都正常。

拓拔奇
2023-03-14

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

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

这样应该行得通。

 类似资料:
  • 我正在尝试使用@ResponseBody实现SpringWebMVC@ExceptionHandler,以返回包含验证错误的对象。(此处记录了策略E)。 在Spring3.0。x、 自解决以来,有一个已确认的错误,它阻止了此功能正常工作。我使用的是Spring 3.1.2,不应该碰到它。 然而,我遇到了一个例外“找不到可接受的代表”。 例外情况如下: 代码如下: 有什么想法吗?

  • 这是我得到的错误: 参考文献:http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/ Spring@ExceptionHandler不能与@ResponseBody一起使用

  • 我有以下控制器: 我只找到了与mvc配置相关的部分:

  • 我需要创建一个自定义字体,适用于整个应用程序中的每个< code>Text组件。 有没有办法在 React Native 中全局设置字体?

  • 这是classBinderData extends BaseAdapter的getView函数: public View getView(int position,View convertView,ViewGroup parent){代码> 添加一行:字体tf=Typeface.createFromAsset(vi.getContext(). getAsset(),"字体/Roboto_Thin.

  • 我有一个简单的python项目,其目录结构如下: 在config.py文件中,我有: 在run.py文件中,我有一个导入语句,如下所示: 当我使用命令行运行python3.5 run.py时,我得到错误: 从主要。配置导入my_config ImportError:没有名为“main”的模块 但当我在运行中添加此项时。py导入它的工作原理: 除了给出绝对路径或其他方式之外,还有其他更好的方法吗?请