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 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; + } }