From ae3c0f8585eae61928737cdb8067545ae58da200 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 4 Dec 2020 17:24:05 +0100 Subject: [PATCH 1/2] DATAJDBC-1836 - Prepare branch --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d395a08985..7cd60c8768 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-commons - 2.5.0-SNAPSHOT + 2.5.0-DATAJDBC-1836-SNAPSHOT Spring Data Core From d70526a39c22d279ce5411fc353a8627d1fba83c Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Mon, 7 Dec 2020 15:10:03 +0100 Subject: [PATCH 2/2] DATACMNS-1836 - Adds JSR310 converters to the converters used for projections. Similar converters where removed because they clashed with the support for nullable wrappers. This adds them back as dedicated converters that does not clash with conversions for nullable wrappers. See https://github.com/spring-projects/spring-data-commons/commit/bd3992dfc56cc53e3be4a6d7ea106594fd7d81e5#diff-96f7084777a2a702d85f5c600e542b10123d6c3332ed3d3f8e329ca7061faab0R55 --- .../projection/ProxyProjectionFactory.java | 3 ++ .../ProxyProjectionFactoryUnitTests.java | 46 +++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/projection/ProxyProjectionFactory.java b/src/main/java/org/springframework/data/projection/ProxyProjectionFactory.java index ed3157011b..bb74cec7b6 100644 --- a/src/main/java/org/springframework/data/projection/ProxyProjectionFactory.java +++ b/src/main/java/org/springframework/data/projection/ProxyProjectionFactory.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.GenericConversionService; +import org.springframework.data.convert.Jsr310Converters; import org.springframework.data.util.NullableWrapperConverters; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -43,6 +44,7 @@ * @author Oliver Gierke * @author Christoph Strobl * @author Mark Paluch + * @author Jens Schauder * @see SpelAwareProxyProjectionFactory * @since 1.10 */ @@ -51,6 +53,7 @@ class ProxyProjectionFactory implements ProjectionFactory, BeanClassLoaderAware final static GenericConversionService CONVERSION_SERVICE = new DefaultConversionService(); static { + Jsr310Converters.getConvertersToRegister().forEach(CONVERSION_SERVICE::addConverter); NullableWrapperConverters.registerConvertersIn(CONVERSION_SERVICE); CONVERSION_SERVICE.removeConvertible(Object.class, Object.class); } diff --git a/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java b/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java index 23a05effb5..64480b9eb0 100755 --- a/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java @@ -19,7 +19,11 @@ import java.beans.PropertyDescriptor; import java.lang.reflect.Proxy; +import java.time.LocalDateTime; +import java.util.Calendar; import java.util.Collections; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -37,6 +41,7 @@ * @author Oliver Gierke * @author Wim Deblauwe * @author Mark Paluch + * @author Jens Schauder */ class ProxyProjectionFactoryUnitTests { @@ -276,17 +281,30 @@ void supportsOptionalWithProjectionAsReturnTypeIfPresent() { }); } + @Test // DATACMNS-1836 + void supportsDateToLocalDateTimeConversion() { + + Customer customer = new Customer(); + customer.firstname = "Dave"; + customer.dob = new GregorianCalendar(1967, Calendar.JANUARY, 9).getTime(); + + customer.address = new Address(); + customer.address.city = "New York"; + customer.address.zipCode = "ZIP"; + + CustomerWithLocalDateTime excerpt = factory.createProjection(CustomerWithLocalDateTime.class, customer); + + assertThat(excerpt.getFirstname()).isEqualTo("Dave"); + assertThat(excerpt.getDob()).isEqualTo(LocalDateTime.of(1967, 1, 9, 0, 0)); + + } + interface Contact {} - static class Customer implements Contact { + interface CustomerWithLocalDateTime { + String getFirstname(); - Long id; - String firstname, lastname; - Address address; - byte[] picture; - Address[] shippingAddresses; - Map data; - Optional optional; + LocalDateTime getDob(); } static class Address { @@ -336,4 +354,16 @@ interface CustomerWithOptionalHavingProjection { Optional getAddress(); } + + static class Customer implements Contact { + + Long id; + String firstname, lastname; + Date dob; + Address address; + byte[] picture; + Address[] shippingAddresses; + Map data; + Optional optional; + } }