从ResponseStatusException中删除“ trace”字段

时间:2019-02-22 12:41:01

标签: spring-boot

在spring控制器中,如果找不到任何实体,则返回ResponseStatusException,如下所示:

@GetMapping("/categories/{id}")
  public ResponseEntity<Category> getCategoryById(@PathVariable(value = "id") String id) {
    try {
      return new ResponseEntity<Category>(categoryService.findById(id), HttpStatus.OK);
    } catch (CategoryNotFoundException ex) {
      throw new ResponseStatusException(HttpStatus.NOT_FOUND, ex.getMessage());
    }
  }

我希望答案是这样的:

{
    "timestamp": "2019-02-22T12:25:29.913+0000",
    "status": 404,
    "error": "Not Found",
    "message": "could not find category with ID: XYZ'.",
    "path": "/categories/XYZ"
}

但是响应还包括带有嵌套异常的长字段"trace"
有没有办法摆脱跟踪字段?

4 个答案:

答案 0 :(得分:28)

打开application.properties并添加以下行:

server.error.include-stacktrace=never

答案 1 :(得分:1)

如果您的依赖项中包含“ spring-boot-devtools”,则似乎存在“ trace”字段。 排除devtools之后,我在输出中看不到这样的痕迹。

希望这会有所帮助。

答案 2 :(得分:1)

devtools将属性server.error.include-stacktrace设置为始终

您可以保留devtools,但删除跟踪,并在应用程序中添加以下内容。yml:-

server:
  error:
    include-stacktrace: on-trace-param

答案 3 :(得分:1)

我知道我要参加聚会很晚,但是最近我遇到了这种情况,并采用了另一种解决方案,因为上述解决方案均不适用于我的情况。

我正在使用Spring-boot-devtools,它会自动设置 server.error.include-stacktrace=always

因此,我通过覆盖如下所示的异常类中的fillInStackTrace方法来抑制堆栈跟踪。

public class DuplicateFoundException extends RuntimeException {
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}

ps1:我推荐了this

ps2:您还可以尝试在其他答案中尝试以下建议的解决方案:

(在我的情况下,这些都不起作用)

如果您使用的是application.properties文件,请在属性文件中添加以下行。

server.error.include-stacktrace=on_trace_param

如果您使用的是application.yml文件,请在yml文件中添加以下行。

server:
  error:
    include-stacktrace: on_trace_param