【问题标题】:How to turn HttpMessageNotReadableException into human friendly message without exposing implementation details?如何在不暴露实现细节的情况下将 HttpMessageNotReadableException 变成人性化的消息?
【发布时间】:2022-01-04 11:52:04
【问题描述】:

当使用 Spring Boot 构建 REST API 时,似乎会抛出 HttpMessageNotReadableException,例如 JSON 请求正文不正确,因此无法解析。

假设 REST API 端点需要以下 JSON 请求正文:

{ "email": "myemail@email.com" }

但是,提供了以下 JSON 请求正文(缺少引号):

{ "email: "myemail@email.com" }

结果是以下异常消息:

JSON 解析错误:意外字符('m'(代码 109)):期待 用于分隔字段名称和值的冒号;嵌套异常是 com.fasterxml.jackson.core.JsonParseException:意外字符 ('m' (code 109)): 期望用冒号分隔字段名和 值\n 在 [Source: (PushbackInputStream);行:2,列:15]

现在,此异常消息包含有用的信息,例如意外字符、预期的字符以及位置。然而,异常消息也会泄露实现细节,这对我的用例来说是不可取的。

HttpMessageNotReadableException没有单独暴露获取有用信息的方法。此外,异常消息以不同的“风格”存在,并且没有使用共同的结构,因此字符串解析似乎不可行。

因此,我的问题是:如何在不暴露实现细节的情况下将 HttpMessageNotReadableException 变成人性化的消息?

【问题讨论】:

    标签: spring-boot jackson


    【解决方案1】:

    您可以通过HttpMessageNotReadableException 继承自Throwable 的方法Throwable.getCause 挖掘出您在堆栈跟踪中看到的底层JsonParseException。它可能需要递归应用程序,具体取决于它在堆栈跟踪中的深度。 JsonParseException 有几个 getter 可以返回一些你想要的信息。

    但是,我不会费心重新格式化此错误消息。如果您保持原样,它将简化调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 2010-09-14
      • 2019-07-13
      • 2013-12-04
      • 1970-01-01
      • 2022-08-06
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多