使用Jackson将MongoDB日期字段反序列化为Java POJO

使用Spring Boot 1.4.4.RELEASE,将RequestBody保存到MongoDB,如下所示:

{
    "startTime" : NumberLong("1483542955570"),"startDate" : ISODate("2017-01-04T15:15:55.570Z"),"endTime" : NumberLong("1483542955570"),"endDate" : ISODate("2017-01-04T15:15:55.570Z")
}

在将其映射回Java POJO时,我正在尝试以下代码.

public 

serialize具有如下返回的日期字段

"startDate" : { "$date" : "2017-01-04T15:15:55.570Z"}

由于$date,Jackson ObjectMapper在解析期间返回以下异常:

java.lang.RuntimeException: Error parsing mongoDoc to Pojo : errorMessage : {Can not deserialize instance of java.util.Date out of START_OBJECT token at [Source: {
"startTime": 1483542955570,"startDate": {
    "$date": "2017-01-04T15:15:55.570Z"
},"endTime": 1483542955570,"endDate": {
    "$date": "2017-01-04T15:15:55.570Z"
}}; line: 1,column: 381] (through reference chain: com.gofynd.engine.mongo.models.RuleWithDataVO["validity"]->com.gofynd.engine.mongo.models.ValidityVO["startDate"])}

有没有办法解决这个问题而不使用ODM?

最佳答案
反序列化到Date Jackson期望字符串如“2017-01-04T15:15:55.570Z”.相反,它会看到另一个对象的开始(JSON中的{char)因此异常.

考虑指定您的Pojo类和另一个类似于此的MongoDate类:

class MongoDate {
    @JsonProperty("$date")
    Date date;
}

class Pojo {
    long startTime;
    long endTime;
    MongoDate startDate;
    MongoDate endDate;
}

或者,如果您不能/不想添加MongoDate类,则可以为Date字段引入自定义反序列化器.在那种情况下Pojo:

class Pojo {
    long startTime;
    long endTime;
    @JsonDeserialize(using = MongoDateConverter.class)
    Date startDate;
    @JsonDeserialize(using = MongoDateConverter.class)
    Date endDate;
}

反序列化器看起来像这样:

class MongoDateConverter extends JsonDeserializer

相关文章

Spring Cloud为Spring Boot应用程序提供Netflix OSS集成。 提供的功能模块包括服务发现(Eureka),断路...
Spring Cloud 学习笔记;maven配置;入门学习;基于Spring Boot 实现;服务端配置,客户端配置;
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的...
Spring中各种方式进行日期时间处理,有作用于单个实体的,也有作用于全局的,有作用于请求入参的,有作...
跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准,大部分的浏览器都实现了这个标准...
Spring Boot使创建基于Spring的应用程序变得轻松,大部分的SpringBoot应用程序都只需要很少的Spring配置...