spring-boot - 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 Boot 2.3 以来的预期行为,如此处所述
在 application.properties 中的设置server.error.include-message=always
解决了这个问题。
推荐阅读
- php - 基于 Mysqli 查询的 PHP 重定向
- sql - 临时数据库中需要多少个临时数据库数据文件,微软是否有相同的建议?
- oauth - 以编程方式访问 G Suite 域公共文档(例如,G Drive 文档对所有员工公开)
- asp.net-mvc - 添加 Autofac Webapi2 后应用程序停止工作。没有例外
- snowflake-cloud-data-platform - SQL UDF 中传递的参数数量限制是多少?
- angular - valueChanges 在第二次模糊后有效,但在第一次模糊后无效
- c++ - 尽管没有外部库,但未解决的外部
- google-cloud-platform - 使用 gcloud 创建 Stackdriver 警报政策?(不从文件加载)
- git - powershell调用&运算符:设置输出编码
- python-3.x - `TypeError: *: 'Operation' 和 'int' 的不支持的操作数类型`。Keras张量流