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. Closes gh-32238
This commit is contained in:
parent
abe381488a
commit
9b93c948a7
|
@ -200,9 +200,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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -287,7 +287,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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue