diff --git a/pom.xml b/pom.xml index 6a81501ac0..0ab001b5d5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-commons - 2.3.0.BUILD-SNAPSHOT + 2.3.0.DATACMNS-1597-SNAPSHOT Spring Data Core diff --git a/src/main/java/org/springframework/data/convert/CustomConversions.java b/src/main/java/org/springframework/data/convert/CustomConversions.java index a52e0a249a..0dd8f26d4f 100644 --- a/src/main/java/org/springframework/data/convert/CustomConversions.java +++ b/src/main/java/org/springframework/data/convert/CustomConversions.java @@ -49,6 +49,7 @@ * @author Thomas Darimont * @author Christoph Strobl * @author Mark Paluch + * @author Anshul Mehra * @since 2.0 */ @Slf4j @@ -107,7 +108,9 @@ public CustomConversions(StoreConversions storeConversions, Collection conver toRegister.addAll(DEFAULT_CONVERTERS); toRegister.stream()// - .flatMap(it -> storeConversions.getRegistrationsFor(it).stream())// + .flatMap(converter -> storeConversions.getRegistrationsFor(converter).stream())// + .filter(registration -> registration.isReading() ? registration.isSimpleSourceType() : true)// + .filter(registration -> registration.isWriting() ? registration.isSimpleTargetType() : true)// .forEach(this::register); Collections.reverse(toRegister); diff --git a/src/test/java/org/springframework/data/convert/CustomConversionsUnitTests.java b/src/test/java/org/springframework/data/convert/CustomConversionsUnitTests.java index 75e99b8b85..328b93d7b5 100644 --- a/src/test/java/org/springframework/data/convert/CustomConversionsUnitTests.java +++ b/src/test/java/org/springframework/data/convert/CustomConversionsUnitTests.java @@ -17,13 +17,20 @@ import static org.assertj.core.api.Assertions.*; +import java.math.BigInteger; import java.text.DateFormat; import java.text.Format; import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZonedDateTime; import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.Locale; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; import org.joda.time.DateTime; import org.junit.Test; @@ -46,6 +53,7 @@ * @author Oliver Gierke * @author Christoph Strobl * @author Mark Paluch + * @author Anshul Mehra * @since 2.0 */ public class CustomConversionsUnitTests { @@ -156,6 +164,16 @@ public void registersConvertersForJsr310() { assertThat(customConversions.hasCustomWriteTarget(java.time.LocalDateTime.class)).isTrue(); } + @Test // DATACMNS-1597 + public void skipsRegisteringConvertersForNonSimpleTypes() { + + CustomConversions customConversions = new CustomConversions(StoreConversions.of(CustomSimpleTypes.HOLDER, + Collections.singletonList(ZonedDateTimeToInstantConverter.INSTANCE)), Collections.emptyList()); + + assertThat(customConversions.hasCustomWriteTarget(ZonedDateTime.class, Instant.class)).isFalse(); + assertThat(customConversions.hasCustomReadTarget(java.time.LocalDateTime.class, Instant.class)).isFalse(); + } + @Test // DATAMONGO-1131, DATACMNS-1035 public void registersConvertersForThreeTenBackPort() { @@ -279,6 +297,17 @@ public String convert(Object source) { } + @WritingConverter + enum ZonedDateTimeToInstantConverter implements Converter { + + INSTANCE; + + @Override + public Instant convert(ZonedDateTime source) { + return source.toInstant(); + } + } + @WritingConverter static class FormatConverterFactory implements ConverterFactory { @@ -312,4 +341,39 @@ public T convert(String source) { } static class CustomType {} + + static class CustomSimpleTypes { + + public static final Set> AUTOGENERATED_ID_TYPES; + + static { + Set> classes = new HashSet<>(); + classes.add(String.class); + classes.add(BigInteger.class); + AUTOGENERATED_ID_TYPES = Collections.unmodifiableSet(classes); + + Set> simpleTypes = new HashSet<>(); + simpleTypes.add(Pattern.class); + simpleTypes.add(UUID.class); + + CUSTOM_SIMPLE_TYPES = Collections.unmodifiableSet(simpleTypes); + } + + private static final Set> CUSTOM_SIMPLE_TYPES; + + public static final SimpleTypeHolder HOLDER = new SimpleTypeHolder(CUSTOM_SIMPLE_TYPES, true) { + + @Override + public boolean isSimpleType(Class type) { + + if (type.getName().startsWith("java.time")) { + return false; + } + + return super.isSimpleType(type); + } + }; + + private CustomSimpleTypes() {} + } }