diff --git a/pom.xml b/pom.xml
index 2ace266bf9..f623579bc9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-commons
- 4.2.0-SNAPSHOT
+ 4.2.0-GH-3500-SNAPSHOT
Spring Data Core
Core Spring concepts underpinning every Spring Data module.
diff --git a/src/main/java/org/springframework/data/core/TypeDiscoverer.java b/src/main/java/org/springframework/data/core/TypeDiscoverer.java
index 60ca3d3576..7ebf2f7ad8 100644
--- a/src/main/java/org/springframework/data/core/TypeDiscoverer.java
+++ b/src/main/java/org/springframework/data/core/TypeDiscoverer.java
@@ -407,8 +407,11 @@ private Map> doGetProperties() {
Map> result = new HashMap<>();
Class> type = getType();
- FieldCallback callback = field -> result.put(field.getName(),
- TypeInformation.of(ResolvableType.forField(field, resolvableType)));
+ FieldCallback callback = field -> {
+ if (!result.containsKey(field.getName())) {
+ result.put(field.getName(), TypeInformation.of(ResolvableType.forField(field, resolvableType)));
+ }
+ };
// Inspect fields first
ReflectionUtils.doWithFields(type, callback);
diff --git a/src/test/java/org/springframework/data/core/TypeDiscovererUnitTests.java b/src/test/java/org/springframework/data/core/TypeDiscovererUnitTests.java
index 7ab688eeeb..dbbc70e21c 100755
--- a/src/test/java/org/springframework/data/core/TypeDiscovererUnitTests.java
+++ b/src/test/java/org/springframework/data/core/TypeDiscovererUnitTests.java
@@ -379,6 +379,14 @@ void considersNestedGenericsInEqualityForRecursiveUnresolvableTypes() throws Exc
assertThat(domainType.isAssignableFrom(actualType)).isTrue();
}
+ @Test // GH-3500
+ void superclassFieldsDoNotHideSubclassFields() {
+
+ TypeDiscoverer> discoverer = TypeDiscoverer.ofCached(ResolvableType.forClass(TheOne.class));
+
+ assertThat(discoverer.getProperty("theOne").getType()).isEqualTo(String.class);
+ }
+
class Person {
Addresses addresses;
@@ -487,6 +495,16 @@ static abstract class SomeType> {
}
+ static class SuperclassWithProperties {
+ private CharSequence theOne;
+ private String theOther;
+ }
+
+ class TheOne extends SuperclassWithProperties {
+ private String theOne;
+ }
+
+
@SuppressWarnings("rawtypes")
interface RepoWithRawGenerics extends Repository {