#1402 - Properly create Property instances in PropertyUtils.

We now hand the already known property name (from the PropertyDescriptor) to the Property instance we create when inspecting classes for metadata. This avoids ambiguities stemming from the fact that Property assumes Java Bean style properties but Spring's BeanUtils also supporting Java Records style accessors. In special naming contexts like the one used in the test case, this can lead to properties considered "the same" as their accessor methods imply their name is the same.
This commit is contained in:
Oliver Drotbohm
2021-09-09 13:00:32 +02:00
parent f891f3be6d
commit 4705797322
2 changed files with 22 additions and 1 deletions

View File

@@ -229,7 +229,7 @@ public class PropertyUtils {
return type == null //
? Stream.empty() //
: getPropertyDescriptors(type) //
.map(it -> new AnnotatedProperty(new Property(type, it.getReadMethod(), it.getWriteMethod())))
.map(it -> new AnnotatedProperty(new Property(type, it.getReadMethod(), it.getWriteMethod(), it.getName())))
.map(it -> JSR_303_PRESENT ? new Jsr303AwarePropertyMetadata(it) : new DefaultPropertyMetadata(it));
}

View File

@@ -201,6 +201,13 @@ class PropertyUtilsTest {
assertThat(getProperty(metadata, "renamed")).isPresent();
}
@Test // #1402
void detectesPropertiesWithRecordStyleAccessorsCorrectly() {
assertThatNoException()
.isThrownBy(() -> PropertyUtils.getExposedProperties(TypeWithRecordStyleAccessors.class));
}
@Data
@AllArgsConstructor
@JsonIgnoreProperties({ "ignoreThisProperty" })
@@ -321,4 +328,18 @@ class PropertyUtilsTest {
private static Optional<PropertyMetadata> getProperty(PayloadMetadata metadata, String name) {
return metadata.stream().filter(it -> it.hasName(name)).findFirst();
}
// #1402
static class TypeWithRecordStyleAccessors {
private Boolean isActive;
public Boolean isActive() {
return isActive;
}
public void setActive(Boolean active) {
isActive = active;
}
}
}