Skip to content

Use UUID toString representation for UUID values when converting org.bson.Document to json String #3551

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.2.0-SNAPSHOT</version>
<version>3.2.0-GH-3546-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Spring Data MongoDB</name>
Expand Down
2 changes: 1 addition & 1 deletion spring-data-mongodb-benchmarks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.2.0-SNAPSHOT</version>
<version>3.2.0-GH-3546-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion spring-data-mongodb-distribution/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.2.0-SNAPSHOT</version>
<version>3.2.0-GH-3546-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion spring-data-mongodb/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.2.0-SNAPSHOT</version>
<version>3.2.0-GH-3546-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,18 @@
import java.util.Collection;
import java.util.Currency;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import org.bson.BsonReader;
import org.bson.BsonTimestamp;
import org.bson.BsonWriter;
import org.bson.Document;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.types.Binary;
import org.bson.types.Code;
import org.bson.types.Decimal128;
Expand All @@ -45,11 +52,12 @@
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.mongodb.core.query.Term;
import org.springframework.data.mongodb.core.script.NamedMongoScript;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.NumberUtils;
import org.springframework.util.StringUtils;

import com.mongodb.MongoClientSettings;

/**
* Wrapper class to contain useful converters for the usage with Mongo.
*
Expand Down Expand Up @@ -236,9 +244,27 @@ enum DocumentToStringConverter implements Converter<Document, String> {

INSTANCE;

private final Codec<Document> codec = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new Codec<UUID>() {

@Override
public void encode(BsonWriter writer, UUID value, EncoderContext encoderContext) {
writer.writeString(value.toString());
}

@Override
public Class<UUID> getEncoderClass() {
return UUID.class;
}

@Override
public UUID decode(BsonReader reader, DecoderContext decoderContext) {
throw new IllegalStateException("decode not supported");
}
}), MongoClientSettings.getDefaultCodecRegistry()).get(Document.class);

@Override
public String convert(Document source) {
return source.toJson();
return source.toJson(codec);
}
}

Expand Down Expand Up @@ -268,7 +294,7 @@ enum DocumentToNamedMongoScriptConverter implements Converter<Document, NamedMon
@Override
public NamedMongoScript convert(Document source) {

if(source.isEmpty()) {
if (source.isEmpty()) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,15 +97,15 @@
* @author Heesu Jung
*/
@ExtendWith(MockitoExtension.class)
public class MappingMongoConverterUnitTests {
class MappingMongoConverterUnitTests {

private MappingMongoConverter converter;
private MongoMappingContext mappingContext;
@Mock ApplicationContext context;
@Mock DbRefResolver resolver;

@BeforeEach
void setUp() {
void beforeEach() {

MongoCustomConversions conversions = new MongoCustomConversions();

Expand Down Expand Up @@ -524,6 +524,7 @@ void writesBigIntegerIdCorrectly() {
assertThat(result.get("_id")).isInstanceOf(String.class);
}

@Test
public void convertsObjectsIfNecessary() {

ObjectId id = new ObjectId();
Expand Down Expand Up @@ -2179,6 +2180,15 @@ public void readAndConvertDBRefNestedByMapCorrectly() {
assertThat(((LinkedHashMap) result.get("cluster")).get("_id")).isEqualTo(100L);
}

@Test // GH-3546
void readFlattensNestedDocumentToStringIfNecessary() {

org.bson.Document source = new org.bson.Document("street", new org.bson.Document("json", "string").append("_id", UUID.randomUUID()));

Address target = converter.read(Address.class, source);
assertThat(target.street).isNotNull();
}

static class GenericType<T> {
T content;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Currency;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import org.assertj.core.data.TemporalUnitLessThanOffset;
import org.bson.BsonTimestamp;
import org.bson.Document;
import org.junit.jupiter.api.Test;

import org.springframework.core.convert.support.ConfigurableConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.geo.Box;
Expand All @@ -42,6 +42,7 @@
import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.BsonTimestampToInstantConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.CurrencyToStringConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.DocumentToStringConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.IntegerToAtomicIntegerConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.LongToAtomicLongConverter;
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter;
Expand All @@ -55,10 +56,10 @@
* @author Thomas Darimont
* @author Christoph Strobl
*/
public class MongoConvertersUnitTests {
class MongoConvertersUnitTests {

@Test
public void convertsBigDecimalToStringAndBackCorrectly() {
void convertsBigDecimalToStringAndBackCorrectly() {

BigDecimal bigDecimal = BigDecimal.valueOf(254, 1);
String value = BigDecimalToStringConverter.INSTANCE.convert(bigDecimal);
Expand All @@ -69,7 +70,7 @@ public void convertsBigDecimalToStringAndBackCorrectly() {
}

@Test // DATAMONGO-858
public void convertsBoxToDocumentAndBackCorrectly() {
void convertsBoxToDocumentAndBackCorrectly() {

Box box = new Box(new Point(1, 2), new Point(3, 4));

Expand All @@ -80,7 +81,7 @@ public void convertsBoxToDocumentAndBackCorrectly() {
}

@Test // DATAMONGO-858
public void convertsCircleToDocumentAndBackCorrectly() {
void convertsCircleToDocumentAndBackCorrectly() {

Circle circle = new Circle(new Point(1, 2), 3);

Expand All @@ -91,7 +92,7 @@ public void convertsCircleToDocumentAndBackCorrectly() {
}

@Test // DATAMONGO-858
public void convertsPolygonToDocumentAndBackCorrectly() {
void convertsPolygonToDocumentAndBackCorrectly() {

Polygon polygon = new Polygon(new Point(1, 2), new Point(2, 3), new Point(3, 4), new Point(5, 6));

Expand All @@ -102,7 +103,7 @@ public void convertsPolygonToDocumentAndBackCorrectly() {
}

@Test // DATAMONGO-858
public void convertsSphereToDocumentAndBackCorrectly() {
void convertsSphereToDocumentAndBackCorrectly() {

Sphere sphere = new Sphere(new Point(1, 2), 3);

Expand All @@ -113,7 +114,7 @@ public void convertsSphereToDocumentAndBackCorrectly() {
}

@Test // DATAMONGO-858
public void convertsPointToListAndBackCorrectly() {
void convertsPointToListAndBackCorrectly() {

Point point = new Point(1, 2);

Expand All @@ -124,44 +125,44 @@ public void convertsPointToListAndBackCorrectly() {
}

@Test // DATAMONGO-1372
public void convertsCurrencyToStringCorrectly() {
void convertsCurrencyToStringCorrectly() {
assertThat(CurrencyToStringConverter.INSTANCE.convert(Currency.getInstance("USD"))).isEqualTo("USD");
}

@Test // DATAMONGO-1372
public void convertsStringToCurrencyCorrectly() {
void convertsStringToCurrencyCorrectly() {
assertThat(StringToCurrencyConverter.INSTANCE.convert("USD")).isEqualTo(Currency.getInstance("USD"));
}

@Test // DATAMONGO-1416
public void convertsAtomicLongToLongCorrectly() {
void convertsAtomicLongToLongCorrectly() {
assertThat(AtomicLongToLongConverter.INSTANCE.convert(new AtomicLong(100L))).isEqualTo(100L);
}

@Test // DATAMONGO-1416
public void convertsAtomicIntegerToIntegerCorrectly() {
void convertsAtomicIntegerToIntegerCorrectly() {
assertThat(AtomicIntegerToIntegerConverter.INSTANCE.convert(new AtomicInteger(100))).isEqualTo(100);
}

@Test // DATAMONGO-1416
public void convertsLongToAtomicLongCorrectly() {
void convertsLongToAtomicLongCorrectly() {
assertThat(LongToAtomicLongConverter.INSTANCE.convert(100L)).isInstanceOf(AtomicLong.class);
}

@Test // DATAMONGO-1416
public void convertsIntegerToAtomicIntegerCorrectly() {
void convertsIntegerToAtomicIntegerCorrectly() {
assertThat(IntegerToAtomicIntegerConverter.INSTANCE.convert(100)).isInstanceOf(AtomicInteger.class);
}

@Test // DATAMONGO-2113
public void convertsBsonTimestampToInstantCorrectly() {
void convertsBsonTimestampToInstantCorrectly() {

assertThat(BsonTimestampToInstantConverter.INSTANCE.convert(new BsonTimestamp(6615900307735969796L)))
.isCloseTo(Instant.ofEpochSecond(1540384327), new TemporalUnitLessThanOffset(100, ChronoUnit.MILLIS));
}

@Test // DATAMONGO-2210
public void convertsUrisToString() {
void convertsUrisToString() {

MongoCustomConversions conversions = new MongoCustomConversions();

Expand All @@ -173,4 +174,12 @@ public void convertsUrisToString() {
assertThat(conversionService.convert(URI.create("/segment"), String.class)).isEqualTo("/segment");
assertThat(conversionService.convert("/segment", URI.class)).isEqualTo(URI.create("/segment"));
}

@Test // GH-3546
void convertsDocumentWithUUidToString() {

UUID uuid = UUID.randomUUID();
assertThat(DocumentToStringConverter.INSTANCE.convert(new Document("_id", uuid)))
.isEqualTo("{\"_id\": \"" + uuid.toString() + "\"}");
}
}