首页 > 解决方案 > Spring-Boot 从 ErrorAttributes 中删除消息作为响应

问题描述

从 spring-boot 控制器抛出异常时,服务器响应中的消息为空 - 但前提是我不在本地运行。最后一部分是最让我困惑的部分。我的意思是,能够让 spring-boot 从错误响应中删除部分是非常有意义的。例如,就像堆栈跟踪一样,除了调试时,没有人愿意将其发送出去。

但是当我在本地运行应用程序时,我得到了完整的错误响应、消息、堆栈跟踪和所有内容(即使没有在调试模式下运行,我首先怀疑这可能是造成这种情况的原因)。典型的错误可能如下所示:

{
    "timestamp": "2020-10-14T09:46:35.784+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "webcam.yellow.service.controller.error.BadRequestException: New password must be different from old password! at /*REDACTED*/",
    "message": "New password must be different from old password!",
    "path": "/users/9"
}

但是当我在部署的服务器上产生相同的错误时,我得到的只是:

{
    "timestamp": "2020-10-14T09:29:57.720+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "",
    "path": "/users/9"
}

我根本不介意堆栈跟踪被删除(实际上我希望它被删除),但我真的很想收到那个错误消息。

我的一个想法是它可能与跨域访问有关,但是当我通过 swagger 而不是我们的前端产生错误时,我得到了相同的行为,并且 swagger 是同源的。

我完全希望这种行为可以在 spring-boot 中配置,这很方便。麻烦的是,我没有配置它。我将正在运行的服务器的配置属性与我的本地配置属性进行了比较,但我没有看到任何可能对此负责的属性。如果我用谷歌搜索,我也找不到任何东西。根据我找到的所有教程,这应该可以正常工作。它会做什么,除了不在正在运行的服务器上。

有谁知道 spring-boot 中的什么导致了这种行为以及如何配置它?顺便使用 spring-boot 2.3.3。

附加信息:

经过一番鬼混,我设法在本地重现了这个问题。如果我构建应用程序,我会得到缩短的错误响应,然后直接使用 java -jar 从命令行运行它。运行 gradle bootRun 会导致服务器返回完整的错误消息。

我试图通过 ControllerAdvice 返回我自己的错误响应:

@ControllerAdvice
class BadRequestHandler : ResponseEntityExceptionHandler() {

    @ExceptionHandler(value = [BadRequestException::class])
    protected fun handleBadRequest(ex: BadRequestException, request: WebRequest): ResponseEntity<Any> {
        val message = ex.message
        return ResponseEntity(message, HttpHeaders(), HttpStatus.BAD_REQUEST)
    }
}

这只是为了快速测试,看看我是否可以更改服务器响应。结果我做不到,尽管执行了处理程序,但客户端仍然得到相同的响应。因此,无论从请求中获取信息,都必须在链条的下游。

有人知道这里发生了什么吗?

标签: spring-bootexecutable-jar

解决方案


这是自 Spring Boot 2.3 以来的预期行为,如此处所述

在 application.properties 中的设置server.error.include-message=always解决了这个问题。


推荐阅读