Skip to content

Commit 597d682

Browse files
christophstroblmp911de
authored andcommitted
Use UUID toString representation when converting org.bson.Document into a json String.
This commit switches the rendering of UUID values to their toString format when printing org.bson.Document to json via the DocumentToString converter. This will move the resulting representation from {"$binary": "QUK3ZihZ9cdhWjTf5TZqrw==", "$type": "03"} to 480971b0-7160-4120-acd0-6fd6b82418ad which is the more natural variant within Java applications. The conversion only applies on read in cases where an entire document eg. a composite id, is mapped to a String property of the domain model. Closes #3546. Original pull request: #3551.
1 parent 8b06045 commit 597d682

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java

+23-5
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,18 @@
2727
import java.util.Collection;
2828
import java.util.Currency;
2929
import java.util.List;
30+
import java.util.UUID;
3031
import java.util.concurrent.atomic.AtomicInteger;
3132
import java.util.concurrent.atomic.AtomicLong;
3233

34+
import org.bson.BsonReader;
3335
import org.bson.BsonTimestamp;
36+
import org.bson.BsonWriter;
3437
import org.bson.Document;
35-
import org.bson.UuidRepresentation;
3638
import org.bson.codecs.Codec;
37-
import org.bson.internal.CodecRegistryHelper;
39+
import org.bson.codecs.DecoderContext;
40+
import org.bson.codecs.EncoderContext;
41+
import org.bson.codecs.configuration.CodecRegistries;
3842
import org.bson.types.Binary;
3943
import org.bson.types.Code;
4044
import org.bson.types.Decimal128;
@@ -240,9 +244,23 @@ enum DocumentToStringConverter implements Converter<Document, String> {
240244

241245
INSTANCE;
242246

243-
private final Codec<Document> codec = CodecRegistryHelper
244-
.createRegistry(MongoClientSettings.getDefaultCodecRegistry(), UuidRepresentation.JAVA_LEGACY)
245-
.get(Document.class);
247+
private final Codec<Document> codec = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new Codec<UUID>() {
248+
249+
@Override
250+
public void encode(BsonWriter writer, UUID value, EncoderContext encoderContext) {
251+
writer.writeString(value.toString());
252+
}
253+
254+
@Override
255+
public Class<UUID> getEncoderClass() {
256+
return UUID.class;
257+
}
258+
259+
@Override
260+
public UUID decode(BsonReader reader, DecoderContext decoderContext) {
261+
throw new IllegalStateException("decode not supported");
262+
}
263+
}), MongoClientSettings.getDefaultCodecRegistry()).get(Document.class);
246264

247265
@Override
248266
public String convert(Document source) {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
import java.time.Instant;
2323
import java.time.temporal.ChronoUnit;
2424
import java.util.Currency;
25+
import java.util.UUID;
2526
import java.util.concurrent.atomic.AtomicInteger;
2627
import java.util.concurrent.atomic.AtomicLong;
2728

2829
import org.assertj.core.data.TemporalUnitLessThanOffset;
2930
import org.bson.BsonTimestamp;
3031
import org.bson.Document;
3132
import org.junit.jupiter.api.Test;
32-
3333
import org.springframework.core.convert.support.ConfigurableConversionService;
3434
import org.springframework.core.convert.support.DefaultConversionService;
3535
import org.springframework.data.geo.Box;
@@ -42,6 +42,7 @@
4242
import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter;
4343
import org.springframework.data.mongodb.core.convert.MongoConverters.BsonTimestampToInstantConverter;
4444
import org.springframework.data.mongodb.core.convert.MongoConverters.CurrencyToStringConverter;
45+
import org.springframework.data.mongodb.core.convert.MongoConverters.DocumentToStringConverter;
4546
import org.springframework.data.mongodb.core.convert.MongoConverters.IntegerToAtomicIntegerConverter;
4647
import org.springframework.data.mongodb.core.convert.MongoConverters.LongToAtomicLongConverter;
4748
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter;
@@ -173,4 +174,12 @@ public void convertsUrisToString() {
173174
assertThat(conversionService.convert(URI.create("/segment"), String.class)).isEqualTo("/segment");
174175
assertThat(conversionService.convert("/segment", URI.class)).isEqualTo(URI.create("/segment"));
175176
}
177+
178+
@Test // GH-3546
179+
void convertsDocumentWithUUidToString() {
180+
181+
UUID uuid = UUID.randomUUID();
182+
assertThat(DocumentToStringConverter.INSTANCE.convert(new Document("_id", uuid)))
183+
.isEqualTo("{\"_id\": \"" + uuid.toString() + "\"}");
184+
}
176185
}

0 commit comments

Comments
 (0)