From ec50d96d2357ad9ae5309cca7fa41a363f9d95ff Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 5 Mar 2019 15:22:27 +0100 Subject: [PATCH] DATAMONGO-2210 - Add support to persist URI instances out of the box. We now register Converter implementations that persist a URI as String by default to avoid the reflection inspection of URI instances. --- .../mongodb/core/convert/MongoConverters.java | 5 +++++ .../core/convert/MongoConvertersUnitTests.java | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) 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")); + } }