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 {