Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix BeanProvider's find method #7133

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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 {

Expand Down Expand Up @@ -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<BeanNumber> provider;
Test(@OneQualifier BeanProvider<BeanNumber> 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'
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -70,7 +71,16 @@ public Object get() {

@Override
public Optional<Object> find(Qualifier<Object> qualifier) {
return ((DefaultBeanContext) context).findBean(resolutionContext, argument, finalQualifier);
Qualifier<Object> 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
Expand Down