deserializing ISODate objects from Mongo

1,419 views
Skip to first unread message

Don Gately

unread,
Sep 2, 2014, 3:43:35 PM9/2/14
to mongo-jack...@googlegroups.com
Hi,
I have existing data in Mongo formatted as such:

"created_at" : ISODate("2011-11-25T18:17:16Z")

Mongo java driver correctly deserializes that to DBObject, w/ key = "created_at", and value type = java.util.Date, value = "2011-11-25T18:17:16Z"  (as seen via IntelliJ debugger, which may have called toString on the date).

When I try to deserialize into java POJO like so: 

Foo rehydratedFoo = jacksonDbCollection.convertFromDbObject(dbObject, Foo.class);

I get an error:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.Date out of VALUE_EMBEDDED_OBJECT token

1) Do I need to annotate my Date fields (like we do for ObjectId fields: @Id, @ObjectId)?
2) Do i need to hook up a custom deserializer?  (I see DateDeserializer in the codebase.  Use it?)

Thx,
DG

Don Gately

unread,
Sep 2, 2014, 6:43:22 PM9/2/14
to mongo-jack...@googlegroups.com
I was able to solve this as follows:

1) add maven dependency:

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>${jackson.version}</version>
        </dependency>

2) register MongoJack's DateDeserializer class with Jackson.  NOTE: you must register your deserializer with Jackson's object mapper before constructing your JacksonDBCollection object.  Some deep copy must occur, so you can modify your ObjectMapper later & expect it to work.

    /**
     * Register MongoJack's Date deserializer w/ Jackson so that you can deserialize ISODate() dates from Mongo.
     *
     * @param mapper The Jackson object mapper which will use your deserializer.
     */
    public static void register(ObjectMapper mapper) {
        SimpleModule mongoDateModule =
                new SimpleModule("MongoDateDeserializer", new Version(1, 0, 0, "", "", ""));
        mongoDateModule.addDeserializer(Date.class, new DateDeserializer());

        mapper.registerModule(mongoDateModule);
    }
Reply all
Reply to author
Forward
0 new messages