diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java index 71f80b8ee..27b1720e4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java @@ -38,6 +38,8 @@ import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalT import org.springframework.data.mongodb.core.convert.MongoConverters.BigIntegerToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.StringToURLConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.URLToStringConverter; import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; import org.springframework.util.Assert; @@ -89,6 +91,8 @@ public class CustomConversions { this.converters.add(StringToBigDecimalConverter.INSTANCE); this.converters.add(BigIntegerToStringConverter.INSTANCE); this.converters.add(StringToBigIntegerConverter.INSTANCE); + this.converters.add(URLToStringConverter.INSTANCE); + this.converters.add(StringToURLConverter.INSTANCE); this.converters.addAll(converters); for (Object c : this.converters) { 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 80e116ff8..07655c844 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 @@ -17,8 +17,12 @@ package org.springframework.data.mongodb.core.convert; import java.math.BigDecimal; import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URL; import org.bson.types.ObjectId; +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; import org.springframework.util.StringUtils; @@ -119,4 +123,28 @@ abstract class MongoConverters { return StringUtils.hasText(source) ? new BigInteger(source) : null; } } + + public static enum URLToStringConverter implements Converter { + INSTANCE; + + public String convert(URL source) { + return source == null ? null : source.toString(); + } + } + + public static enum StringToURLConverter implements Converter { + INSTANCE; + + private static final TypeDescriptor SOURCE = TypeDescriptor.valueOf(String.class); + private static final TypeDescriptor TARGET = TypeDescriptor.valueOf(URL.class); + + public URL convert(String source) { + + try { + return source == null ? null : new URL(source); + } catch (MalformedURLException e) { + throw new ConversionFailedException(SOURCE, TARGET, source, e); + } + } + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java index 8660c47cf..9fae44fe6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java @@ -3,6 +3,7 @@ package org.springframework.data.mongodb.core.convert; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.net.URL; import java.text.DateFormat; import java.text.Format; import java.util.Arrays; @@ -152,6 +153,25 @@ public class CustomConversionsUnitTests { assertThat(conversions.isSimpleType(Binary.class), is(true)); } + /** + * @see DATAMONGO-462 + */ + @Test + public void hasWriteConverterForURL() { + + CustomConversions conversions = new CustomConversions(); + assertThat(conversions.hasCustomWriteTarget(URL.class), is(true)); + } + + /** + * @see DATAMONGO-462 + */ + @Test + public void readTargetForURL() { + CustomConversions conversions = new CustomConversions(); + assertThat(conversions.hasCustomReadTarget(String.class, URL.class), is(true)); + } + enum FormatToStringConverter implements Converter { INSTANCE; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index e982a1167..7591dc464 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -21,6 +21,7 @@ import static org.junit.Assert.*; import java.math.BigDecimal; import java.math.BigInteger; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1034,6 +1035,30 @@ public class MappingMongoConverterUnitTests { assertThat(readResult.iterator().next(), is(Map.class)); } + /** + * @see DATAMONGO-462 + */ + @Test + public void readsURLsAsStringsByDefault() throws Exception { + DBObject dbObject = new BasicDBObject("url", new URL("http://springsource.org")); + URLWrapper result = converter.read(URLWrapper.class, dbObject); + assertThat(result.url, is(new URL("http://springsource.org"))); + } + + /** + * @see DATAMONGO-462 + */ + @Test + public void writesURLsAsStringsByDefault() throws Exception { + + URLWrapper wrapper = new URLWrapper(); + wrapper.url = new URL("http://springsource.org"); + DBObject sink = new BasicDBObject(); + + converter.write(wrapper, sink); + assertThat(sink.get("url"), is((Object) "http://springsource.org")); + } + static class GenericType { T content; } @@ -1165,6 +1190,10 @@ public class MappingMongoConverterUnitTests { Object value; } + static class URLWrapper { + URL url; + } + private class LocalDateToDateConverter implements Converter { public Date convert(LocalDate source) {