【问题标题】:Micronaut POJO deserialisation error message when the format is invalid or type throws error格式无效或类型抛出错误时的 Micronaut POJO 反序列化错误消息
【发布时间】:2022-09-28 22:47:36
【问题描述】:

当为我的应用程序的请求提供不正确的字段格式时,如果类型抛出错误,那么 micronaut 返回的错误消息是模糊的。

E.G 两种情况

public class fakeClass {
    @NotNull
    private String fakeName;
}

如果我的要求是{\"fakeName\": \"\"}

那么正确的响应将类似于

{
\"violations\": [
    {
        \"field\": \"create.fakeClass.fakeName\",
        \"message\": \"must not be blank\"
    }
],
\"type\": \"https://zalando.github.io/problem/constraint-violation\",
\"title\": \"Constraint Violation\",
\"status\": 400 }

但是可以说我的班级看起来像这样:

   public class fakeClass {
    @Format(\"yyyy-MM-dd\")
    private LocalDate exampeDate;
}

{\"exampleDate\": 202222--01-01}{\"exampleDate\": 2022/01/01} 的日期无效或格式不正确

然后错误信息是

{
\"type\": \"about:blank\",
\"parameters\": {
    \"path\": \"/project\"
},
\"status\": 400,
\"detail\": \"Required argument [fakeClass fakeClass] not specified\"

}

是否有一种简单的方法可以为错误消息提供更多信息,以明确为什么请求因@NotNull 或@NotBlank 等无效格式或类型而失败?

    标签: deserialization micronaut


    【解决方案1】:

    这里的问题不是 Micronaut,而是你的有效载荷。你提到的例子是无效的 JSON 文档.

    例如,此处的 this 无效,因为该值不是数字也不是字符串。

    {
      "exampleDate": 202222--01-01
    }
    

    这将是一个有效的变体

    {
      "exampleDate": "202222--01-01"
    }
    

    确保将日期作为字符串发送。在您的情况下,这应该是有效的。

    {
      "exampleDate": "2022-11-01"
    }
    

    一般来说,建议使用 ISO-8601 格式发送日期,就像您所做的那样 (yyyy-MM-dd)。此外,我建议应用全局配置,而不是在每个 POJO 上使用 @Format("yyyy-MM-dd") 注释。

    jackson:
      dateFormat: yyyyMMdd
      timeZone: UTC
      serializationInclusion: NON_NULL
      serialization:
        writeDatesAsTimestamps: false
    

    【讨论】:

    • 啊,感谢您对全局配置的提醒。我会试试的。 \n 我的示例请求实际上是一个错误。实际上,它们是字符串(尽管上面的示例不正确)。 E.G { "exampleDate": "20222--01-01" } 给出错误:"detail": "Required argument [fakeClass fakeClass] not specified" 而不是:{ "field": "create.fakeClass.fakeName", "message": "must not be blank" }
    【解决方案2】:

    @Format("yyyy-MM-dd") 是格式化程序而不是 Constraint

    您可以使用@Pattern(<regex>)。还有特定日期的,如@Past@PastOrPresent@Future@FutureOrPresent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多