diff --git a/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java b/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java index ab1ad08b..063a5a00 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java +++ b/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java @@ -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)); } diff --git a/src/test/java/org/springframework/hateoas/mediatype/PropertyUtilsTest.java b/src/test/java/org/springframework/hateoas/mediatype/PropertyUtilsTest.java index e44b89ab..bfafc434 100644 --- a/src/test/java/org/springframework/hateoas/mediatype/PropertyUtilsTest.java +++ b/src/test/java/org/springframework/hateoas/mediatype/PropertyUtilsTest.java @@ -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 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; + } + } }