From bb952cb95e37404b3f5b0eb8d7a659a3eeeddab0 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 13 Jun 2022 18:32:50 +0200 Subject: [PATCH] Register native hints for jakarta.inject annotations Prior to this commit, native images would dynamically check for the presence of `jakarta.inject.*` annotations and might fail at runtime or miss them entirely. This change ensures that if such classes are present during the AOT build, relevant runtime hints are registered so that these annotations can be read at runtime. Closes gh-28614 --- spring-core/spring-core.gradle | 1 + .../CoreAnnotationsRuntimeHintsRegistrar.java | 5 +++++ .../CoreAnnotationsRuntimeHintsRegistrarTests.java | 14 ++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/spring-core/spring-core.gradle b/spring-core/spring-core.gradle index d9ce7201e8d..c80a60849fa 100644 --- a/spring-core/spring-core.gradle +++ b/spring-core/spring-core.gradle @@ -60,6 +60,7 @@ dependencies { optional("io.smallrye.reactive:mutiny") optional("io.netty:netty-buffer") testImplementation("jakarta.annotation:jakarta.annotation-api") + testImplementation("jakarta.inject:jakarta.inject-api") testImplementation("jakarta.xml.bind:jakarta.xml.bind-api") testImplementation("com.google.code.findbugs:jsr305") testImplementation("com.fasterxml.woodstox:woodstox-core") diff --git a/spring-core/src/main/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrar.java index a8ad865e823..30480b3c5ec 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrar.java @@ -23,6 +23,7 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.Order; import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; /** * {@link RuntimeHintsRegistrar} for core annotations. @@ -36,6 +37,10 @@ class CoreAnnotationsRuntimeHintsRegistrar implements RuntimeHintsRegistrar { public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { Stream.of(AliasFor.class, Order.class).forEach(annotationType -> RuntimeHintsUtils.registerAnnotation(hints, annotationType)); + if (ClassUtils.isPresent("jakarta.inject.Inject", classLoader)) { + Stream.of("jakarta.inject.Inject", "jakarta.inject.Qualifier").forEach(annotationType -> + RuntimeHintsUtils.registerAnnotation(hints, ClassUtils.resolveClassName(annotationType, classLoader))); + } } } diff --git a/spring-core/src/test/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrarTests.java index d21f25fe8c2..94d63183381 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/support/CoreAnnotationsRuntimeHintsRegistrarTests.java @@ -16,6 +16,8 @@ package org.springframework.aot.hint.support; +import jakarta.inject.Inject; +import jakarta.inject.Qualifier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -59,4 +61,16 @@ class CoreAnnotationsRuntimeHintsRegistrarTests { .withMemberCategory(MemberCategory.INVOKE_DECLARED_METHODS)).accepts(this.hints); } + @Test + void jakartaInjectAnnotationHasHints() { + assertThat(RuntimeHintsPredicates.reflection().onType(Inject.class) + .withMemberCategory(MemberCategory.INVOKE_DECLARED_METHODS)).accepts(this.hints); + } + + @Test + void jakartaQualifierAnnotationHasHints() { + assertThat(RuntimeHintsPredicates.reflection().onType(Qualifier.class) + .withMemberCategory(MemberCategory.INVOKE_DECLARED_METHODS)).accepts(this.hints); + } + }