diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java index 5a6d7e854..4372e254c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java @@ -15,9 +15,12 @@ */ package org.springframework.data.mongodb.core.convert; +import static org.springframework.data.convert.ConverterBuilder.*; + import java.math.BigDecimal; import java.math.BigInteger; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.time.Instant; import java.util.ArrayList; @@ -90,6 +93,8 @@ abstract class MongoConverters { converters.add(BinaryToByteArrayConverter.INSTANCE); converters.add(BsonTimestampToInstantConverter.INSTANCE); + converters.add(reading(String.class, URI.class, URI::create).andWriting(URI::toString)); + return converters; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java index 490be43f1..6778bd6c1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java @@ -18,6 +18,7 @@ package org.springframework.data.mongodb.core.convert; import static org.assertj.core.api.Assertions.*; import java.math.BigDecimal; +import java.net.URI; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Currency; @@ -28,6 +29,8 @@ import org.assertj.core.data.TemporalUnitLessThanOffset; import org.bson.BsonTimestamp; import org.bson.Document; import org.junit.Test; +import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.geo.Box; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Point; @@ -156,4 +159,17 @@ public class MongoConvertersUnitTests { .isCloseTo(Instant.ofEpochSecond(1540384327), new TemporalUnitLessThanOffset(100, ChronoUnit.MILLIS)); } + @Test // DATAMONGO-2210 + public void convertsUrisToString() { + + MongoCustomConversions conversions = new MongoCustomConversions(); + + assertThat(conversions.getSimpleTypeHolder().isSimpleType(URI.class)).isTrue(); + + ConfigurableConversionService conversionService = new DefaultConversionService(); + conversions.registerConvertersIn(conversionService); + + assertThat(conversionService.convert(URI.create("/segment"), String.class)).isEqualTo("/segment"); + assertThat(conversionService.convert("/segment", URI.class)).isEqualTo(URI.create("/segment")); + } }