diff --git a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java index f04bdd5ac..02a0902f8 100644 --- a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java +++ b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java @@ -30,6 +30,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; @@ -62,6 +64,7 @@ import org.springframework.data.util.Streamable; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils.FieldCallback; import org.springframework.util.ReflectionUtils.FieldFilter; @@ -87,6 +90,8 @@ import org.springframework.util.ReflectionUtils.FieldFilter; public abstract class AbstractMappingContext, P extends PersistentProperty

> implements MappingContext, ApplicationEventPublisherAware, ApplicationContextAware, InitializingBean { + private static final Logger LOGGER = LoggerFactory.getLogger(MappingContext.class); + private final Optional NONE = Optional.empty(); private final Map, Optional> persistentEntities = new HashMap<>(); private final PersistentPropertyAccessorFactory persistentPropertyAccessorFactory; @@ -550,6 +555,10 @@ public abstract class AbstractMappingContext context.getPersistentEntity(Unsupported.class)); } + @Test // DATACMNS-1509 + public void shouldIgnoreKotlinOverrideCtorPropertyInSuperClass() { + + BasicPersistentEntity entity = context + .getPersistentEntity(ClassTypeInformation.from(ShadowingPropertyTypeWithCtor.class)); + entity.doWithProperties((PropertyHandler) property -> { + assertThat(property.getField().getDeclaringClass()).isNotEqualTo(ShadowedPropertyTypeWithCtor.class); + }); + } + + @Test // DATACMNS-1509 + public void shouldIgnoreKotlinOverridePropertyInSuperClass() { + + BasicPersistentEntity entity = context + .getPersistentEntity(ClassTypeInformation.from(ShadowingPropertyType.class)); + entity.doWithProperties((PropertyHandler) property -> { + assertThat(property.getField().getDeclaringClass()).isNotEqualTo(ShadowedPropertyType.class); + }); + } + + @Test // DATACMNS-1509 + public void shouldStillIncludeNonKotlinShadowedPropertyInSuperClass() { + + BasicPersistentEntity entity = context + .getPersistentEntity(ClassTypeInformation.from(ShadowingProperty.class)); + + assertThat(StreamUtils.createStreamFromIterator(entity.iterator()) + .filter(it -> it.getField().getDeclaringClass().equals(ShadowedProperty.class)).findFirst() // + ).isNotEmpty(); + } + private static void assertHasEntityFor(Class type, SampleMappingContext context, boolean expected) { boolean found = false; @@ -306,4 +344,37 @@ class AbstractMappingContextUnitTests { }; } } + + static class ShadowedProperty { + + private final String value; + + ShadowedProperty(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + + static class ShadowingProperty extends ShadowedProperty { + + private String value; + + ShadowingProperty(String value) { + super(value); + this.value = value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String getValue() { + return value; + } + } + }