【问题标题】:How to catch a @JsonFormat exception in spring and handle it gracefully to process the payload?如何在 spring 中捕获 @JsonFormat 异常并优雅地处理它以处理有效负载?
【发布时间】:2019-03-13 08:15:46
【问题描述】:

我有一个 spring 应用程序,我在其中使用 @JsonFormat 注释来反序列化日期格式。但是,当我发送一组元素时,即使其中一个条目的日期无效,我的整个有效负载也会失败。

有没有办法通过优雅地处理这个异常来克服这个问题,或者用默认值替换失败的日期或忽略该数组条目。

jackson.version: 2.7.5, spring.version:5.0.0.RELEASE

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
private Date date;

【问题讨论】:

  • 请在问题中添加您的实现..我的意思是您如何使用注释 JsonFormat 以及它将以什么格式出现,因此您会看到异常。同样可以理解,您有一个强制字段在反序列化中失败,因此我们不能在附加值或空值上使用 JsonIgnore。
  • 我相信我使用的格式并不重要。在我的场景中,每当我发送错误的格式时,我都希望处理它。无论如何,我将添加 @JsonFormat 无论如何都要使用的注释。

标签: java spring jackson


【解决方案1】:

您可以为您的班级编写自定义deserializer,在其中设置默认值以防出现问题。比如:

public class MyJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            return new Date();
        }

    }

}

然后在你的课堂上你可以做这样的事情:

class MyClass {
    //...Fields

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    @JsonDeserialize(using = MyJsonDateDeserializer.class)
    private Date date;

    //...Fields
}

如果你知道它的值并不总是必要的,你也可以在你的类上添加@JsonIgnoreProperties(ignoreUnknown = true)

【讨论】:

  • 谢谢,让我试试这个,但我必须同时添加@JsonFormat@JsonDeserialize 吗?
  • 是的,你必须同时添加。
  • 试过了,看起来不错。将答案标记为正确。我注意到的一件事是,即使我删除了@JsonFormat 注释,控制权也会到达MyJsonDateDeserializer
  • 是的。因为你添加了@JsonDeserialize,它基本上说在你将json字符串转换为对象之前,总是要经过这个类。因此,流程转到MyJsonDeserializer
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 2023-03-21
  • 1970-01-01
  • 2017-03-04
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多