Skip to content

Commit ac638b2

Browse files
committed
JAVA-1741: In order to preserve backwards compatibility with the 2.x driver, encode instances of java.util.Date subclasses (in particular java.sql.Date and java.sql.Timestamp) as BSON dates.
Note: for java.sql.Timestamp in particular, this can result in information loss, as the nanos field is silently ignored (it's acknowledged in the javadoc for Timestamp that the inheritance relationship between the two classes is a mistake). Note: As this is only for backwards compatibility, support for encoding Date subclasses has only been added for DBObject, and not other containers like Document.
1 parent 45f0335 commit ac638b2

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

driver/src/main/com/mongodb/DBObjectCodecProvider.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818

1919
import org.bson.codecs.BsonTypeClassMap;
2020
import org.bson.codecs.Codec;
21+
import org.bson.codecs.DateCodec;
2122
import org.bson.codecs.configuration.CodecProvider;
2223
import org.bson.codecs.configuration.CodecRegistry;
2324
import org.bson.types.BSONTimestamp;
2425

26+
import java.util.Date;
27+
2528
/**
2629
* A provider for a DBObjectCodec.
2730
*
@@ -59,6 +62,10 @@ public <T> Codec<T> get(final Class<T> clazz, final CodecRegistry registry) {
5962
return (Codec<T>) new DBObjectCodec(registry, bsonTypeClassMap);
6063
}
6164

65+
if (Date.class.isAssignableFrom(clazz)) {
66+
return (Codec<T>) new DateCodec();
67+
}
68+
6269
return null;
6370
}
6471

driver/src/test/unit/com/mongodb/DBObjectCodecSpecification.groovy

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import org.bson.types.Binary
3232
import org.bson.types.Symbol
3333
import spock.lang.Specification
3434

35+
import java.sql.Timestamp
36+
3537
import static org.bson.UuidRepresentation.STANDARD
3638
import static org.bson.codecs.configuration.CodecRegistries.fromCodecs
3739
import static org.bson.codecs.configuration.CodecRegistries.fromProviders
@@ -135,4 +137,34 @@ class DBObjectCodecSpecification extends Specification {
135137
then:
136138
decodedSymbol.get('symbol') == symbol.toString()
137139
}
140+
141+
def 'should encode java.sql.Date as date'() {
142+
given:
143+
def sqlDate = new java.sql.Date(System.currentTimeMillis())
144+
def doc = new BasicDBObject('d', sqlDate)
145+
146+
when:
147+
dbObjectCodec.encode(new BsonDocumentWriter(bsonDoc), doc, EncoderContext.builder().build())
148+
149+
then:
150+
def decodededDoc = dbObjectCodec.decode(new BsonDocumentReader(bsonDoc), DecoderContext.builder().build())
151+
152+
then:
153+
((Date) decodededDoc.get('d')).getTime() == sqlDate.getTime()
154+
}
155+
156+
def 'should encode java.sql.Timestamp as date'() {
157+
given:
158+
def sqlTimestamp = new Timestamp(System.currentTimeMillis())
159+
def doc = new BasicDBObject('d', sqlTimestamp)
160+
161+
when:
162+
dbObjectCodec.encode(new BsonDocumentWriter(bsonDoc), doc, EncoderContext.builder().build())
163+
164+
then:
165+
def decodededDoc = dbObjectCodec.decode(new BsonDocumentReader(bsonDoc), DecoderContext.builder().build())
166+
167+
then:
168+
((Date) decodededDoc.get('d')).getTime() == sqlTimestamp.getTime()
169+
}
138170
}

0 commit comments

Comments
 (0)