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

如何在不公开实现细节的情况下,将HttpMessageEndableException转换为人性化的消息?

东门俊智
2023-03-14

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

假设REST APIendpoint需要以下JSON请求体:

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

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

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

结果是以下异常消息:

JSON解析错误:意外字符('m'(代码109)):期望冒号分隔字段名和值;嵌套异常是com.fasterxml.jackson.core.JsonParseExc0019:意外字符('m'(代码109)):期望冒号分隔字段名和值\n at[Source:(Pushback InputStream);行: 2,列: 15]

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

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

因此,我的问题是:如何在不暴露实现细节的情况下将HttpMessageNotReadableExcure转换为人类友好的消息?

共有1个答案

钱浩荡
2023-03-14

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

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

 类似资料:
  • 问题内容: 我需要一个解决方案将String转换为字节数组,而无需像这样更改: 输入: 输出: 当我使用 那么回复是 但我希望回复是 问题答案: 您应始终确保序列化和反序列化使用相同的字符集,这会将字符映射到字节序列,反之亦然。默认情况下,String.getBytes()和新的String(bytes)使用默认字符集,该字符集可能是特定于语言环境的。 使用getBytes(Charset)重载

  • 我在用org。乔达。时间LocalDate和LocalDateTime。我从外部源获得一个Unix时间戳,并希望从中生成一个LocalDate(时间)。关键是,在该外部系统的界面中定义,所有日期/时间都在UTC时区内。因此,我希望避免从该时间戳到本地系统的任何默认时区的任何隐式转换,这可能与UTC不同。有一个LocalDateTime的构造器用于这些事情,所以我尝试(作为一个例子): 结果让我有点

  • 问题内容: 我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期到达的格式。 这或许让他们或等。 如何将这些字符串转换为Date?我尝试了这个: 但是,当我打印出someDate时,它的打印方式是这样的:2019-08-05 12:42:48.638 CEST这意味着,但是当我运行以上代码时,日期对象现在变成了,至少可以这样说。 有什么想法可以正确格式化日期格式吗? 问题答案: 你不能!

  • 我有代码,工作完全按要求。但是,我们的企业构建服务器拒绝任何带有编译器警告的签入。 由于我没有使用await语句,因此(如预期的那样)对于带有操作to Func转换的操作构造函数显示了以下警告。 更新-建议答案#1 _operation=()=>new Task(operation.invoke); _rollback=()=>new Task(rollback.invoke); 更新-接受的答案

  • 问题内容: 尝试如下 输出:12.0 但我想获得12.00的精度 请让我知道正确的方法,而不在字符串类中使用format()方法 问题答案: 使用而不是双重: 之所以有效,是因为保持了“精度”,构造函数将其设置为从右边的数字开始,并在中使用它。因此,如果仅将其丢弃,它就会打印出来。