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

如何将应用程序设置为只返回ResponseStatusException的消息?

蓟雪峰
2023-03-14

默认情况下,spring boot不会为任何异常返回消息,包括ResponseStatusException,这意味着下面关于Bar的消息不会返回给客户端

    @GetMapping("/foo")
    @ResponseBody
    public Foo getFoo(@RequestParam(name = "bar", defaultValue = "0") int bar) {
        if (bar <= 0) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "bar must always be positive");
        }
        return example.getFoo(bar);
    }

这可以通过在application.properties中设置server.error.include-message=allays来更改,但是这会导致所有异常消息返回到客户端,包括以下消息:

    @GetMapping("/baz")
    @ResponseBody
    public Baz getBaz() {
        if (!security.checkSecurity()) {
            throw new RuntimeException("Security breach! Hope no one finds out!");
        }
        return example.getBaz();
    }

我知道这是一个微不足道的示例,解决方案只是“不要从控制器抛出服务器异常”,但异常实际上可能来自应用程序中深埋的其他代码,甚至可能是NullPointerException或其他任何代码。

如何使应用程序只显示来自ResponseStatusException的消息,而不显示其他类型的异常?(我想除了在每个控制器方法中添加try-catch子句之外。)

共有1个答案

桂鑫鹏
2023-03-14

您可以向任何控制器添加额外的(@ExceptionHandler)方法,专门处理同一控制器中的请求处理(@RequestMapping)方法引发的异常。这些方法可以:

  • 处理没有@ResponseStatus批注的异常(通常是您没有编写的预定义异常)
  • 将用户重定向到专用错误视图
  • 生成完全定义的错误响应

控制器建议允许您使用完全相同的异常处理技术,但将它们应用于整个应用程序,而不仅仅是单个控制器。您可以将它们看作是一个注释驱动的拦截器。

任何带有@ControllerAdvice注释的类都将成为controller-advice,并且支持三种类型的方法:

  • 用@ExceptionHandler注释的异常处理方法。
  • 用@modelAttribute注释的模型增强方法(用于向模型添加附加数据)。请注意,这些属性对异常处理视图不可用。
  • 用@initbinder注释的绑定器初始化方法(用于配置表单处理)。

解决方案:

@ControllerAdvice
public class RestControllerAdvice {

  @ExceptionHandler(ResponseStatusException.class)
  public ResponseEntity<String> handleStatusException(ResponseStatusException exception) {
    return new ResponseEntity<>(exception.getMessage(), HttpStatus.BAD_REQUEST);
  }

  @ExceptionHandler(Exception.class)
  public ResponseEntity<String> handleException(Exception exception) {
    return new ResponseEntity<>("Exception", HttpStatus.INTERNAL_SERVER_ERROR);
  }
}
 类似资料:
  • 当我从Netbeans运行项目时,它工作正常:图标出现在窗口的左上角和任务栏中。图像位于项目的根目录中。 当我清理和构建项目时,它生成两个安装程序:一个exe和一个MSI;当我安装应用程序并打开它时,窗口没有图标sicadcam.png,它有默认的java徽标图标。

  • 问题内容: 如何为Android应用程序设置IntelliJ IDEA? 问题答案: 我花了整整一天的时间尝试将所有内容组合在一起,涉及数百个站点和教程,但是它们都跳过了琐碎的步骤。 因此,这里是完整的指南: 下载并安装 Java JDK (选择Java平台) 下载并安装 Android SDK (建议安装程序) android SD完成安装后,在 Android SDK Tools* 下打开 S

  • 如何设置电子应用程序的应用程序图标? 我正在尝试

  • 问题内容: 我有一个非常简单的,我正在尝试设置自定义错误消息。但是由于某种原因,该错误没有显示出来。 这是我的控制器: 这是我得到的答复: 我正在传递JSON,但我没有验证任何内容,我只是在尝试设置自定义消息。如果更改状态代码,则会在响应中看到它,但是始终为空。 为什么这不按预期工作?这是一个非常简单的示例,我看不到可能缺少的内容。当我调试代码时,我可以看到错误消息设置了所有字段。但是由于某种原因

  • 我有一个非常简单的< code>@RestController,我试图设置一个自定义的错误消息。但是由于某种原因,错误的< code >消息没有显示出来。 这是我的控制器: 这是我得到的回应: 我正在传递一个JSON,但我没有验证任何东西,我只是试图设置自定义消息。如果我更改状态代码,我会在响应中看到,但< code>message始终为空。 为什么这没有像预期的那样工作?这是一个如此简单的示例,

  • 问题内容: 我的表中有一行我不想更改(曾经)。 是否可以将MySQL行设置为READ-ONLY,以便不能以任何方式更新它?如果是这样,怎么办? 如果不是,是否可以在该行的某一列中设置一个永久值,以使其无法更改?如果是这样,怎么办? 谢谢。 问题答案: 这可能是业务逻辑,可能不属于您的数据存储层。但是,仍然可以使用触发器来实现。 如果将要更新“锁定”记录,则可以创建引发错误的触发器;由于 在执行 该