diff --git a/src/main/java/org/springframework/data/auditing/DefaultAuditableBeanWrapperFactory.java b/src/main/java/org/springframework/data/auditing/DefaultAuditableBeanWrapperFactory.java index 537977a4a..52cd7004e 100644 --- a/src/main/java/org/springframework/data/auditing/DefaultAuditableBeanWrapperFactory.java +++ b/src/main/java/org/springframework/data/auditing/DefaultAuditableBeanWrapperFactory.java @@ -42,14 +42,26 @@ import org.springframework.util.Assert; * @author Oliver Gierke * @author Christoph Strobl * @author Jens Schauder + * @author Pavel Horal * @since 1.5 */ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory { - protected final ConversionService conversionService; + private final ConversionService conversionService; public DefaultAuditableBeanWrapperFactory() { - this.conversionService = getDateConversionService(); + + DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); + + JodaTimeConverters.getConvertersToRegister().forEach(conversionService::addConverter); + Jsr310Converters.getConvertersToRegister().forEach(conversionService::addConverter); + ThreeTenBackPortConverters.getConvertersToRegister().forEach(conversionService::addConverter); + + this.conversionService = conversionService; + } + + ConversionService getConversionService() { + return conversionService; } /** @@ -58,6 +70,7 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory * @param source the auditing candidate. * @return */ + @Override @SuppressWarnings("unchecked") public Optional> getBeanWrapperFor(T source) { @@ -79,21 +92,6 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory }); } - /** - * Creates conversion service for conversions between {@link TemporalAccessor} values and other supported date type values. - * - * @return - */ - static ConversionService getDateConversionService() { - DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); - - JodaTimeConverters.getConvertersToRegister().forEach(conversionService::addConverter); - Jsr310Converters.getConvertersToRegister().forEach(conversionService::addConverter); - ThreeTenBackPortConverters.getConvertersToRegister().forEach(conversionService::addConverter); - - return conversionService; - } - /** * An {@link AuditableBeanWrapper} that works with objects implementing * @@ -107,6 +105,7 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory @SuppressWarnings("unchecked") public AuditableInterfaceBeanWrapper(ConversionService conversionService, Auditable auditable) { + super(conversionService); this.auditable = auditable; diff --git a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java index 5e2c5da1e..bb56a3ca9 100644 --- a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java +++ b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java @@ -17,10 +17,10 @@ package org.springframework.data.auditing; import java.lang.annotation.Annotation; import java.time.temporal.TemporalAccessor; -import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.function.Predicate; +import java.util.stream.Stream; import org.springframework.core.convert.ConversionService; import org.springframework.data.annotation.CreatedBy; @@ -49,6 +49,7 @@ import org.springframework.util.ConcurrentReferenceHashMap; * * @author Oliver Gierke * @author Christoph Strobl + * @author Pavel Horal * @since 1.8 */ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrapperFactory { @@ -88,7 +89,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap key -> new MappingAuditingMetadata(context, it.getClass())); return Optional.> ofNullable(metadata.isAuditable() // - ? new MappingMetadataAuditableBeanWrapper(conversionService, entity.getPropertyPathAccessor(it), metadata) + ? new MappingMetadataAuditableBeanWrapper<>(getConversionService(), entity.getPropertyPathAccessor(it), + metadata) : null); }).orElseGet(() -> super.getBeanWrapperFor(source)); @@ -126,8 +128,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap this.lastModifiedDatePaths = findPropertyPaths(type, LastModifiedDate.class, context); this.isAuditable = Lazy.of( // - () -> Arrays.asList(createdByPaths, createdDatePaths, lastModifiedByPaths, lastModifiedDatePaths) // - .stream() // + () -> // + Stream.of(createdByPaths, createdDatePaths, lastModifiedByPaths, lastModifiedDatePaths) // .anyMatch(it -> !it.isEmpty())// ); } @@ -249,7 +251,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap return accessor.getBean(); } - private > S setProperty( + private S setProperty( PersistentPropertyPaths> paths, S value) { paths.forEach(it -> this.accessor.setProperty(it, value, OPTIONS)); @@ -257,7 +259,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap return value; } - private

> TemporalAccessor setDateProperty( + private TemporalAccessor setDateProperty( PersistentPropertyPaths> property, TemporalAccessor value) { property.forEach(it -> { diff --git a/src/test/java/org/springframework/data/auditing/ReflectionAuditingBeanWrapperUnitTests.java b/src/test/java/org/springframework/data/auditing/ReflectionAuditingBeanWrapperUnitTests.java index 5c2ed8af6..8cfccd45b 100755 --- a/src/test/java/org/springframework/data/auditing/ReflectionAuditingBeanWrapperUnitTests.java +++ b/src/test/java/org/springframework/data/auditing/ReflectionAuditingBeanWrapperUnitTests.java @@ -33,22 +33,22 @@ import org.springframework.data.convert.Jsr310Converters.LocalDateTimeToDateConv * Unit tests for {@link ReflectionAuditingBeanWrapper}. * * @author Oliver Gierke + * @author Pavel Horal * @since 1.5 */ class ReflectionAuditingBeanWrapperUnitTests { ConversionService conversionService; - AnnotationAuditingMetadata metadata; AnnotatedUser user; - AuditableBeanWrapper wrapper; + AuditableBeanWrapper wrapper; LocalDateTime time = LocalDateTime.now(); @BeforeEach void setUp() { - this.conversionService = DefaultAuditableBeanWrapperFactory.getDateConversionService(); + this.conversionService = new DefaultAuditableBeanWrapperFactory().getConversionService(); this.user = new AnnotatedUser(); - this.wrapper = new ReflectionAuditingBeanWrapper(conversionService, user); + this.wrapper = new ReflectionAuditingBeanWrapper<>(conversionService, user); } @Test @@ -76,7 +76,7 @@ class ReflectionAuditingBeanWrapperUnitTests { } Sample sample = new Sample(); - AuditableBeanWrapper wrapper = new ReflectionAuditingBeanWrapper(conversionService, sample); + AuditableBeanWrapper wrapper = new ReflectionAuditingBeanWrapper<>(conversionService, sample); wrapper.setCreatedDate(time); assertThat(sample.createdDate).isEqualTo(time.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli());