diff --git a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java index e202ee66c..e075aabc2 100644 --- a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java +++ b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java @@ -148,7 +148,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap */ static class MappingMetadataAuditableBeanWrapper extends DateConvertingAuditableBeanWrapper { - private final PersistentPropertyAccessor accessor; + private final PersistentPropertyAccessor accessor; private final MappingAuditingMetadata metadata; /** @@ -158,7 +158,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap * @param accessor must not be {@literal null}. * @param metadata must not be {@literal null}. */ - public MappingMetadataAuditableBeanWrapper(PersistentPropertyAccessor accessor, MappingAuditingMetadata metadata) { + public MappingMetadataAuditableBeanWrapper(PersistentPropertyAccessor accessor, + MappingAuditingMetadata metadata) { Assert.notNull(accessor, "PersistentPropertyAccessor must not be null!"); Assert.notNull(metadata, "Auditing metadata must not be null!"); @@ -224,9 +225,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap * @see org.springframework.data.auditing.AuditableBeanWrapper#getBean() */ @Override - @SuppressWarnings("unchecked") public T getBean() { - return (T) accessor.getBean(); + return accessor.getBean(); } private > S setProperty( diff --git a/src/main/java/org/springframework/data/mapping/PersistentEntity.java b/src/main/java/org/springframework/data/mapping/PersistentEntity.java index dcf4caeb9..0773203bb 100644 --- a/src/main/java/org/springframework/data/mapping/PersistentEntity.java +++ b/src/main/java/org/springframework/data/mapping/PersistentEntity.java @@ -285,7 +285,7 @@ public interface PersistentEntity> extends It * @return new {@link PersistentPropertyAccessor}. * @since 1.10 */ - PersistentPropertyAccessor getPropertyAccessor(Object bean); + PersistentPropertyAccessor getPropertyAccessor(B bean); /** * Returns the {@link IdentifierAccessor} for the given bean. diff --git a/src/main/java/org/springframework/data/mapping/PersistentPropertyAccessor.java b/src/main/java/org/springframework/data/mapping/PersistentPropertyAccessor.java index ece298a9f..4ddfb956b 100644 --- a/src/main/java/org/springframework/data/mapping/PersistentPropertyAccessor.java +++ b/src/main/java/org/springframework/data/mapping/PersistentPropertyAccessor.java @@ -33,7 +33,7 @@ import org.springframework.util.Assert; * @see PersistentEntity#getPropertyAccessor(Object) * @see ConvertingPropertyAccessor */ -public interface PersistentPropertyAccessor { +public interface PersistentPropertyAccessor { /** * Sets the given {@link PersistentProperty} to the given value. Will do type conversion if a @@ -71,7 +71,7 @@ public interface PersistentPropertyAccessor { getBean().getClass().getName())); } - PersistentPropertyAccessor accessor = parent == getBean() // + PersistentPropertyAccessor accessor = parent == getBean() // ? this // : leafProperty.getOwner().getPropertyAccessor(parent); @@ -126,7 +126,7 @@ public interface PersistentPropertyAccessor { } PersistentEntity> entity = property.getOwner(); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(current); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(current); current = accessor.getProperty(property); } @@ -140,5 +140,5 @@ public interface PersistentPropertyAccessor { * * @return will never be {@literal null}. */ - Object getBean(); + T getBean(); } diff --git a/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java b/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java index 9c31bd68c..d005ce2f1 100644 --- a/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java +++ b/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java @@ -461,7 +461,7 @@ public class BasicPersistentEntity> implement * @see org.springframework.data.mapping.PersistentEntity#getPropertyAccessor(java.lang.Object) */ @Override - public PersistentPropertyAccessor getPropertyAccessor(Object bean) { + public PersistentPropertyAccessor getPropertyAccessor(B bean) { verifyBeanType(bean); diff --git a/src/main/java/org/springframework/data/mapping/model/BeanWrapper.java b/src/main/java/org/springframework/data/mapping/model/BeanWrapper.java index ee352c15a..edc0bf429 100644 --- a/src/main/java/org/springframework/data/mapping/model/BeanWrapper.java +++ b/src/main/java/org/springframework/data/mapping/model/BeanWrapper.java @@ -40,7 +40,7 @@ import org.springframework.util.ReflectionUtils; * @author Oliver Gierke * @author Mark Paluch */ -class BeanWrapper implements PersistentPropertyAccessor { +class BeanWrapper implements PersistentPropertyAccessor { private T bean; diff --git a/src/main/java/org/springframework/data/mapping/model/BeanWrapperPropertyAccessorFactory.java b/src/main/java/org/springframework/data/mapping/model/BeanWrapperPropertyAccessorFactory.java index 91eeb2ccb..b4dca9d55 100644 --- a/src/main/java/org/springframework/data/mapping/model/BeanWrapperPropertyAccessorFactory.java +++ b/src/main/java/org/springframework/data/mapping/model/BeanWrapperPropertyAccessorFactory.java @@ -32,7 +32,7 @@ enum BeanWrapperPropertyAccessorFactory implements PersistentPropertyAccessorFac * @see org.springframework.data.mapping.model.PersistentPropertyAccessorFactory#getPropertyAccessor(org.springframework.data.mapping.PersistentEntity, java.lang.Object) */ @Override - public PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, Object bean) { + public PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, T bean) { return new BeanWrapper<>(bean); } diff --git a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java index 68d8ae384..d0a7acccc 100644 --- a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java +++ b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java @@ -83,7 +83,7 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert private final ThreadLocal argumentCache = ThreadLocal.withInitial(() -> new Object[1]); private volatile Map, Constructor> constructorMap = new HashMap<>(32); - private volatile Map, Class> propertyAccessorClasses = new HashMap<>( + private volatile Map, Class>> propertyAccessorClasses = new HashMap<>( 32); /* @@ -91,13 +91,13 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert * @see org.springframework.data.mapping.model.PersistentPropertyAccessorFactory#getPropertyAccessor(org.springframework.data.mapping.PersistentEntity, java.lang.Object) */ @Override - public PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, Object bean) { + public PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, T bean) { Constructor constructor = constructorMap.get(entity); if (constructor == null) { - Class accessorClass = potentiallyCreateAndRegisterPersistentPropertyAccessorClass( + Class> accessorClass = potentiallyCreateAndRegisterPersistentPropertyAccessorClass( entity); constructor = accessorClass.getConstructors()[0]; @@ -110,7 +110,7 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert args[0] = bean; try { - return (PersistentPropertyAccessor) constructor.newInstance(args); + return (PersistentPropertyAccessor) constructor.newInstance(args); } catch (Exception e) { throw new IllegalArgumentException(String.format("Cannot create persistent property accessor for %s", entity), e); } finally { @@ -177,11 +177,11 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert /** * @param entity must not be {@literal null}. */ - private synchronized Class potentiallyCreateAndRegisterPersistentPropertyAccessorClass( + private synchronized Class> potentiallyCreateAndRegisterPersistentPropertyAccessorClass( PersistentEntity entity) { - Map, Class> map = this.propertyAccessorClasses; - Class propertyAccessorClass = map.get(entity.getTypeInformation()); + Map, Class>> map = this.propertyAccessorClasses; + Class> propertyAccessorClass = map.get(entity.getTypeInformation()); if (propertyAccessorClass != null) { return propertyAccessorClass; @@ -198,10 +198,10 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert } @SuppressWarnings("unchecked") - private Class createAccessorClass(PersistentEntity entity) { + private Class> createAccessorClass(PersistentEntity entity) { try { - return (Class) PropertyAccessorClassGenerator.generateCustomAccessorClass(entity); + return (Class>) PropertyAccessorClassGenerator.generateCustomAccessorClass(entity); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java b/src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java index f304e7332..7dd6b27b6 100644 --- a/src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java +++ b/src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java @@ -30,9 +30,9 @@ import org.springframework.util.Assert; * @author Oliver Gierke * @author Mark Paluch */ -public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { +public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { - private final PersistentPropertyAccessor accessor; + private final PersistentPropertyAccessor accessor; private final ConversionService conversionService; /** @@ -42,7 +42,7 @@ public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { * @param accessor must not be {@literal null}. * @param conversionService must not be {@literal null}. */ - public ConvertingPropertyAccessor(PersistentPropertyAccessor accessor, ConversionService conversionService) { + public ConvertingPropertyAccessor(PersistentPropertyAccessor accessor, ConversionService conversionService) { Assert.notNull(accessor, "PersistentPropertyAccessor must not be null!"); Assert.notNull(conversionService, "ConversionService must not be null!"); @@ -78,7 +78,7 @@ public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { * @return */ @Nullable - public T getProperty(PersistentProperty property, Class targetType) { + public S getProperty(PersistentProperty property, Class targetType) { Assert.notNull(property, "PersistentProperty must not be null!"); Assert.notNull(targetType, "Target type must not be null!"); @@ -91,7 +91,7 @@ public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { * @see org.springframework.data.mapping.PersistentPropertyAccessor#getBean() */ @Override - public Object getBean() { + public T getBean() { return accessor.getBean(); } @@ -105,8 +105,8 @@ public class ConvertingPropertyAccessor implements PersistentPropertyAccessor { */ @Nullable @SuppressWarnings("unchecked") - private T convertIfNecessary(@Nullable Object source, Class type) { - return (T) (source == null ? null + private S convertIfNecessary(@Nullable Object source, Class type) { + return (S) (source == null ? null : type.isAssignableFrom(source.getClass()) ? source : conversionService.convert(source, type)); } } diff --git a/src/main/java/org/springframework/data/mapping/model/IdPropertyIdentifierAccessor.java b/src/main/java/org/springframework/data/mapping/model/IdPropertyIdentifierAccessor.java index 798b8189c..d261db0a0 100644 --- a/src/main/java/org/springframework/data/mapping/model/IdPropertyIdentifierAccessor.java +++ b/src/main/java/org/springframework/data/mapping/model/IdPropertyIdentifierAccessor.java @@ -32,7 +32,7 @@ import org.springframework.util.Assert; */ public class IdPropertyIdentifierAccessor extends TargetAwareIdentifierAccessor { - private final PersistentPropertyAccessor accessor; + private final PersistentPropertyAccessor accessor; private final PersistentProperty idProperty; /** diff --git a/src/main/java/org/springframework/data/mapping/model/PersistentPropertyAccessorFactory.java b/src/main/java/org/springframework/data/mapping/model/PersistentPropertyAccessorFactory.java index d7a75f6b1..974418496 100644 --- a/src/main/java/org/springframework/data/mapping/model/PersistentPropertyAccessorFactory.java +++ b/src/main/java/org/springframework/data/mapping/model/PersistentPropertyAccessorFactory.java @@ -34,7 +34,7 @@ public interface PersistentPropertyAccessorFactory { * @param bean must not be {@literal null}. * @return will never be {@literal null}. */ - PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, Object bean); + PersistentPropertyAccessor getPropertyAccessor(PersistentEntity entity, T bean); /** * Returns whether given {@link PersistentEntity} is supported by this {@link PersistentPropertyAccessorFactory}. diff --git a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java index 375978ea8..51073570f 100755 --- a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java @@ -193,7 +193,7 @@ public class BasicPersistentEntityUnitTests> { PersistentEntity entity = context.getRequiredPersistentEntity(Entity.class); Entity value = new Entity(); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(value); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(value); assertThat(accessor).isInstanceOf(BeanWrapper.class); assertThat(accessor.getBean()).isEqualTo(value); diff --git a/src/test/java/org/springframework/data/mapping/model/PersistentPropertyAccessorTests.java b/src/test/java/org/springframework/data/mapping/model/PersistentPropertyAccessorTests.java index 11eaf624a..47e831b32 100644 --- a/src/test/java/org/springframework/data/mapping/model/PersistentPropertyAccessorTests.java +++ b/src/test/java/org/springframework/data/mapping/model/PersistentPropertyAccessorTests.java @@ -42,11 +42,11 @@ import org.springframework.data.mapping.context.SamplePersistentProperty; @RunWith(Parameterized.class) public class PersistentPropertyAccessorTests { - private final static SampleMappingContext mappingContext = new SampleMappingContext(); + private final static SampleMappingContext MAPPING_CONTEXT = new SampleMappingContext(); - private final Function propertyAccessorFunction; + private final Function> propertyAccessorFunction; - public PersistentPropertyAccessorTests(Function propertyAccessor, + public PersistentPropertyAccessorTests(Function> propertyAccessor, String displayName) { this.propertyAccessorFunction = propertyAccessor; @@ -60,9 +60,9 @@ public class PersistentPropertyAccessorTests { ClassGeneratingPropertyAccessorFactory factory = new ClassGeneratingPropertyAccessorFactory(); - Function beanWrapper = BeanWrapper::new; - Function classGenerating = it -> factory - .getPropertyAccessor(mappingContext.getRequiredPersistentEntity(it.getClass()), it); + Function> beanWrapper = BeanWrapper::new; + Function> classGenerating = it -> factory + .getPropertyAccessor(MAPPING_CONTEXT.getRequiredPersistentEntity(it.getClass()), it); parameters.add(new Object[] { beanWrapper, "BeanWrapper" }); parameters.add(new Object[] { classGenerating, "ClassGeneratingPropertyAccessorFactory" }); @@ -147,8 +147,7 @@ public class PersistentPropertyAccessorTests { } private static SamplePersistentProperty getProperty(Object bean, String propertyName) { - - return mappingContext.getRequiredPersistentEntity(bean.getClass()).getRequiredPersistentProperty(propertyName); + return MAPPING_CONTEXT.getRequiredPersistentEntity(bean.getClass()).getRequiredPersistentProperty(propertyName); } @Data