[MongoDB, Java] Deserialize MongoDB date fields to Java POJO Using Jackson

 

[Question]

Using Spring Boot 1.4.4.RELEASE, have saved a RequestBody to MongoDB as below:

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

While mapping this back to a Java POJO, I am trying the below code.

public <T> T getPOJOFromMongoDocument(Document resourceDocument, Class<T> clazz) {
        String serialize = JSON.serialize(resourceDocument);
        return objectMapper.readValue(serialize,
                                      clazz);
}

serialize has the date fields returned as following

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

Due to $date, Jackson ObjectMapper returns the below exception during parsing:

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"])}

Is there way to solve this without using an ODM?

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

[Answer]

When deserializing to Date Jackson expects a String like "2017-01-04T15:15:55.570Z". Instead, it sees the start of another object (the { char) inside the JSON hence the exception.

Consider specifying your Pojo class and another MongoDate class similar to this:

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

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

Alternatively if you can't / don't want to add a MongoDate class you can introduce a custom deserializer for Date fields. In that case Pojo:

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

And the deserializer would look like this:

class MongoDateConverter extends JsonDeserializer<Date> {
    private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonNode node = jp.readValueAsTree();
        try {
            return formatter.parse(node.get("$date").asText());
        } catch (ParseException e) {
            return null;
        }
    }
}

 

[출처] https://stackoverflow.com/questions/42856936/deserialize-mongodb-date-fields-to-java-pojo-using-jackson/42862417

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
141 [java] [MyBatis] #{} 와 ${} 개념과 차이점 졸리운_곰 2020.12.11 191
140 [java, mybatis] MyBatis에서 샾(#{})과 달러(${})의 차이는 무엇일까? 졸리운_곰 2020.12.11 190
139 [JAVA] String to int, int to String 형변환 컴퓨터/코딩 졸리운_곰 2020.12.10 188
138 [Java] 현재날짜 구하기 졸리운_곰 2020.12.10 204
137 [Java] [Java] Jackson으로 Json <-> Object 변환(Transformation)하기 졸리운_곰 2020.12.09 279
136 [java] jackson custom serializer, deserializer 만들기 file 졸리운_곰 2020.12.09 235
135 [Java] Deserialize MongoDB date fields to Java POJO Using Jackson 졸리운_곰 2020.12.09 289
134 [Java] Jackson ObjectMapper upper/lower case issues 졸리운_곰 2020.12.09 672
133 Java의 날짜와 시간 API file 졸리운_곰 2020.12.03 257
132 Java로 현재 날짜 / 시간을 얻는 방법 file 졸리운_곰 2020.11.30 625
131 [java, jackson] [jackson] json serialize 만 ignore 하고 싶다면? 졸리운_곰 2020.11.07 196
130 Java MongoDB : Query document 졸리운_곰 2020.11.07 187
129 [Java] Jackson으로 Json <-> Object 변환(Transformation)하기 졸리운_곰 2020.11.07 339
128 [Java, XML, Jackson] Binary JSON with bson4jackson 졸리운_곰 2020.11.07 190
» [MongoDB, Java] Deserialize MongoDB date fields to Java POJO Using Jackson 졸리운_곰 2020.11.07 173
126 Converting DBObject to Java Object while retrieve values from MongoDB 졸리운_곰 2020.11.07 232
125 [Mybatis] 간단한 마이바티스 CRUD 예제 file 졸리운_곰 2020.09.28 663
124 [MyBatis] 검색 SELECT 졸리운_곰 2020.09.24 142
123 Jackson 라이브러리를 이용한 JSON String, Map 간 변환 (How to convert JSON String to Map and Map to JSON String) 졸리운_곰 2020.09.24 245
122 Jackson 라이브러리 기본기능 정리 - json 직렬화와 역직렬화 file 졸리운_곰 2020.09.24 194
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED