micronaut-data icon indicating copy to clipboard operation
micronaut-data copied to clipboard

Micronaut 3.6.1 Multiple possible bean candidates found: [io.micronaut.transaction.async.AsyncTransactionOperations, io.micronaut.transaction.async.AsyncTransactionOperations]

Open riomus opened this issue 3 years ago • 5 comments

Expected Behavior

After upgrading to 3.6.1 app should work as it works in 3.5

Actual Behaviour

After upgrading to 3.6.1 we get duplicate bean exceptions, we do not have any hardcoded deps, things just stop working.

Message: Multiple possible bean candidates found: [io.micronaut.transaction.async.AsyncTransactionOperations, io.micronaut.transaction.async.AsyncTransactionOperations] Path Taken: new DuplicatedBeansTest(AsyncTransactionOperations bean) --> new DuplicatedBeansTest([AsyncTransactionOperations bean]) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2087) at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1297) at com.example.$DuplicatedBeansTest$Definition.build(Unknown Source) at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1680) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1655) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:878) at io.micronaut.context.BeanLocator.findBean(BeanLocator.java:291) at io.micronaut.test.extensions.kotest.MicronautKotestContext.(MicronautKotestContext.kt:43) at io.micronaut.test.extensions.kotest.MicronautKotestExtension.instantiate(MicronautKotestExtension.kt:94) at io.kotest.engine.spec.InstantiateSpecKt.createAndInitializeSpec(instantiateSpec.kt:26) at io.kotest.engine.spec.SpecExecutor.createInstance(SpecExecutor.kt:53) at io.kotest.engine.spec.SpecExecutor.execute(SpecExecutor.kt:40) at io.kotest.engine.launchers.DefaultSpecLauncher$sequential$3$1$2.invokeSuspend(DefaultSpecLauncher.kt:56) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: io.micronaut.context.exceptions.NonUniqueBeanException: Multiple possible bean candidates found: [io.micronaut.transaction.async.AsyncTransactionOperations, io.micronaut.transaction.async.AsyncTransactionOperations] at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:2472) at io.micronaut.context.DefaultApplicationContext.findConcreteCandidate(DefaultApplicationContext.java:484) at io.micronaut.context.DefaultBeanContext.lastChanceResolve(DefaultBeanContext.java:3249) at io.micronaut.context.DefaultBeanContext.findConcreteCandidateNoCache(DefaultBeanContext.java:3140) at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:3058) at io.micronaut.context.DefaultBeanContext.findBeanDefinition(DefaultBeanContext.java:788) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2790) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617) at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:66) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2065) ... 25 more

Steps To Reproduce

Provided minimal reproducer, just run tests

./gradlew check

Environment Information

OS: Arch JDK: 11

Example Application

https://github.com/riomus/micronaut_361_problem

Version

3.6.1

riomus avatar Aug 26 '22 07:08 riomus

I see you are using JDBC with R2DBC. I will try to look for a fix. BTW Why are you adding explicitly testResourcesImplementation dependencies?

dstepanov avatar Aug 26 '22 08:08 dstepanov

Right that could be removed, in our repo we are reimplementing postgres resource to reuse containers in order to improve startup times

riomus avatar Aug 26 '22 08:08 riomus

@riomus Essentially, it is correct, you cannot have multiple datasources with the same name. The transactional aspect at this moment will try to resolve the transactional manager by the named qualifier, which in this case is the same.

Before, it might have worked and caused some unexpected behavior.

dstepanov avatar Aug 31 '22 09:08 dstepanov

So how should we reconfigure our app, we need to have both jdbc and r2dbc in our app, liquibase is using JDBC, r2dbc is used in some parts of our code (but jdbc also)

We do not have multiple jdbc and r2dbc, we have just two defaults, one for jdbc and one for r2dbc

riomus avatar Aug 31 '22 10:08 riomus

I added an example here https://github.com/micronaut-projects/micronaut-data/pull/1717

dstepanov avatar Aug 31 '22 10:08 dstepanov