diff --git a/pipeline.yml b/pipeline.yml index dd2241e..dad882d 100644 --- a/pipeline.yml +++ b/pipeline.yml @@ -88,7 +88,7 @@ jobs: - | rm -rf ~/.m2 ln -s $(pwd)/.m2 ~/.m2 - ./mvnw install -Dspring.version=5.3.16 + ./mvnw install -Dspring.version=6.0.1 - name: deploy plan: - get: source diff --git a/src/main/java/org/springframework/guice/injector/SpringInjector.java b/src/main/java/org/springframework/guice/injector/SpringInjector.java index e575a55..2c39e8b 100644 --- a/src/main/java/org/springframework/guice/injector/SpringInjector.java +++ b/src/main/java/org/springframework/guice/injector/SpringInjector.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.inject.Qualifier; + import com.google.inject.Binding; import com.google.inject.Injector; import com.google.inject.Key; @@ -35,9 +37,12 @@ import com.google.inject.spi.InjectionPoint; import com.google.inject.spi.TypeConverterBinding; import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; +import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; +import org.springframework.beans.factory.support.AutowireCandidateResolver; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.ApplicationContext; +import org.springframework.core.SpringVersion; /** * An {@link Injector} that wraps an {@link ApplicationContext}, and can be used to expose @@ -53,8 +58,17 @@ public class SpringInjector implements Injector { private DefaultListableBeanFactory beanFactory; + private static boolean JAKARTA = false; + public SpringInjector(ApplicationContext context) { this.beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); + AutowireCandidateResolver resolver = this.beanFactory.getAutowireCandidateResolver(); + if (resolver instanceof QualifierAnnotationAutowireCandidateResolver && JAKARTA) { + // Guice does not yet support jakarta namespace but we can help Spring 6 to + // recognize javax.inject + QualifierAnnotationAutowireCandidateResolver qualified = (QualifierAnnotationAutowireCandidateResolver) resolver; + qualified.addQualifierType(Qualifier.class); + } if (context.getBeanNamesForType(Injector.class, true, false).length > 0) { this.injector = context.getBean(Injector.class); } @@ -208,4 +222,11 @@ public class SpringInjector implements Injector { return null; } + static { + String version = SpringVersion.getVersion(); + if (version != null && version.contains(".") && Integer.parseInt(version, 0, version.indexOf("."), 10) > 5) { + JAKARTA = true; + } + } + } diff --git a/src/test/java/org/springframework/guice/AbstractCompleteWiringTests.java b/src/test/java/org/springframework/guice/AbstractCompleteWiringTests.java index 1ee9707..a12a4f2 100644 --- a/src/test/java/org/springframework/guice/AbstractCompleteWiringTests.java +++ b/src/test/java/org/springframework/guice/AbstractCompleteWiringTests.java @@ -58,6 +58,11 @@ public abstract class AbstractCompleteWiringTests { assertThat(this.injector.getInstance(Foo.class)).isNotNull(); } + @Test + public void getInstanceUnboundWithDependency() { + assertThat(this.injector.getInstance(Bar.class).service).isNotNull(); + } + @Test public void getInstanceBound() { assertThat(this.injector.getInstance(Service.class)).isNotNull(); @@ -87,7 +92,8 @@ public abstract class AbstractCompleteWiringTests { @Test public void getNamedInjectedInstance() { - assertThat(this.injector.getInstance(Thing.class).thang).isNotNull(); + Thang thang = this.injector.getInstance(Thing.class).thang; + assertThat(thang).isNotNull(); } @Test