Infer reflection hints for Jackson annotations builder attributes
This notably enables Jackson to reflectively call a user-provided builder class and invoke its declared methods (setters and build) in a native app. See gh-32238 Closes gh-32257
This commit is contained in:
@@ -195,9 +195,15 @@ public class BindingReflectionHintsRegistrar {
|
||||
}
|
||||
|
||||
private void registerHintsForClassAttributes(ReflectionHints hints, MergedAnnotation<Annotation> annotation) {
|
||||
annotation.getRoot().asMap().values().forEach(value -> {
|
||||
annotation.getRoot().asMap().forEach((key,value) -> {
|
||||
if (value instanceof Class<?> classValue && value != Void.class) {
|
||||
hints.registerType(classValue, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
|
||||
if (key.equals("builder")) {
|
||||
hints.registerType(classValue, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
|
||||
MemberCategory.INVOKE_DECLARED_METHODS);
|
||||
}
|
||||
else {
|
||||
hints.registerType(classValue, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -289,7 +289,8 @@ class BindingReflectionHintsRegistrarTests {
|
||||
bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleRecordWithJacksonCustomStrategy.class);
|
||||
assertThat(RuntimeHintsPredicates.reflection().onType(PropertyNamingStrategies.UpperSnakeCaseStrategy.class).withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS))
|
||||
.accepts(this.hints);
|
||||
assertThat(RuntimeHintsPredicates.reflection().onType(SampleRecordWithJacksonCustomStrategy.Builder.class).withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS))
|
||||
assertThat(RuntimeHintsPredicates.reflection().onType(SampleRecordWithJacksonCustomStrategy.Builder.class)
|
||||
.withMemberCategories(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS))
|
||||
.accepts(this.hints);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user