From 316b90ebe4967cc5d251cce53e179ffe41e3be5c Mon Sep 17 00:00:00 2001 From: Paullo612 Date: Fri, 1 Apr 2022 16:35:38 +0300 Subject: [PATCH] Fix BeanProvider's find method (#7133) --- .../inject/provider/BeanProviderSpec.groovy | 65 +++++++++++++++++-- .../provider/BeanProviderDefinition.java | 12 +++- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/inject-java/src/test/groovy/io/micronaut/inject/provider/BeanProviderSpec.groovy b/inject-java/src/test/groovy/io/micronaut/inject/provider/BeanProviderSpec.groovy index 51e99a36448..fc562dd1de6 100644 --- a/inject-java/src/test/groovy/io/micronaut/inject/provider/BeanProviderSpec.groovy +++ b/inject-java/src/test/groovy/io/micronaut/inject/provider/BeanProviderSpec.groovy @@ -17,13 +17,12 @@ package io.micronaut.inject.provider import io.micronaut.annotation.processing.test.AbstractTypeElementSpec import io.micronaut.context.ApplicationContext -import io.micronaut.context.BeanContext -import io.micronaut.context.BeanContextConfiguration -import io.micronaut.context.DefaultBeanContext import io.micronaut.context.exceptions.NoSuchBeanException +import io.micronaut.context.exceptions.NonUniqueBeanException import io.micronaut.inject.BeanDefinition import io.micronaut.inject.BeanDefinitionReference -import io.micronaut.inject.annotation.TestCachePuts +import io.micronaut.inject.annotation.MutableAnnotationMetadata +import io.micronaut.inject.qualifiers.Qualifiers class BeanProviderSpec extends AbstractTypeElementSpec { @@ -200,4 +199,62 @@ class Bar {} cleanup: context.close() } + + void "test BeanProvider's find method" () { + given: + ApplicationContext context = buildContext('''\ +package test; + +import io.micronaut.inject.annotation.*; +import io.micronaut.context.annotation.*; +import io.micronaut.context.BeanProvider; + +@jakarta.inject.Qualifier +@java.lang.annotation.Documented +@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@interface OneQualifier { } + +@jakarta.inject.Qualifier +@java.lang.annotation.Documented +@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@interface TwoQualifier { } + +interface BeanNumber { } + +@OneQualifier +class BeanOne implements BeanNumber { } + +@OneQualifier +@TwoQualifier +class BeanOneTwo implements BeanNumber { } + +@jakarta.inject.Singleton +class Test { + public BeanProvider provider; + Test(@OneQualifier BeanProvider provider) { + this.provider = provider; + } +} +''') + when: + def bean = getBean(context, 'test.Test') + + then: + bean.provider.isPresent() + + when: + bean.provider.find(null) + + then: + thrown(NonUniqueBeanException) + + when: + def metadata = new MutableAnnotationMetadata() + metadata.addDeclaredAnnotation('test.TwoQualifier', Collections.emptyMap()) + def foundBean = bean.provider.find(Qualifiers.byAnnotation(metadata, 'test.TwoQualifier')) + + then: + foundBean.isPresent() + foundBean.get().class.name == 'test.BeanOneTwo' + } } diff --git a/inject/src/main/java/io/micronaut/inject/provider/BeanProviderDefinition.java b/inject/src/main/java/io/micronaut/inject/provider/BeanProviderDefinition.java index de797e37812..5036ddd76ba 100644 --- a/inject/src/main/java/io/micronaut/inject/provider/BeanProviderDefinition.java +++ b/inject/src/main/java/io/micronaut/inject/provider/BeanProviderDefinition.java @@ -23,6 +23,7 @@ import io.micronaut.core.type.Argument; import io.micronaut.inject.BeanDefinition; import io.micronaut.inject.qualifiers.AnyQualifier; +import io.micronaut.inject.qualifiers.Qualifiers; import java.util.Iterator; import java.util.Optional; @@ -70,7 +71,16 @@ public Object get() { @Override public Optional find(Qualifier qualifier) { - return ((DefaultBeanContext) context).findBean(resolutionContext, argument, finalQualifier); + Qualifier actualQualifier; + if (finalQualifier == null) { + actualQualifier = qualifier; + } else if (qualifier == null) { + actualQualifier = finalQualifier; + } else { + actualQualifier = Qualifiers.byQualifiers(finalQualifier, qualifier); + } + + return ((DefaultBeanContext) context).findBean(resolutionContext, argument, actualQualifier); } @Override