micronaut-core: GraalVM error with Micronaut 3: Multiple possible bean candidates found: io.micronaut.aop.InterceptorRegistry

Expected Behavior

Building and executing the native image of the provided and minimal application should succeed. Actually, it was successful on Micronaut 2.5.x but fails since Micronaut 3.0.0

The bug is triggered by injecting a configuration interface:

@ConfigurationProperties("myconfig")
public interface Config {

    String getBaseUrl();
}

into a class which is annotated with @Context:

@Context
public class Bean {

    private final Config config;

    public Bean(Config config) {
        this.config = config;
    }
}

and building and executing the native image based on a generated native image configuration.

The error message is the same as in #6406 but they don’t seem to be related.

Actual Behaviour

build/native/nativeCompile/context fails with

Message: Multiple possible bean candidates found: [io.micronaut.aop.InterceptorRegistry, io.micronaut.aop.InterceptorRegistry]
Path Taken: new Bean([Config config])
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2364)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:3282)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:3268)
        at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2821)
        at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2783)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1639)
        at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:1933)
        at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1189)
        at context.$Bean$Definition.build(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2337)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:3282)
        at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:2665)
        at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1933)
        ... 8 common frames omitted
Caused by: io.micronaut.context.exceptions.NonUniqueBeanException: Multiple possible bean candidates found: [io.micronaut.aop.InterceptorRegistry, io.micronaut.aop.InterceptorRegistry]
        at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:2430)
        at io.micronaut.context.DefaultApplicationContext.findConcreteCandidate(DefaultApplicationContext.java:455)
        at io.micronaut.context.DefaultBeanContext.lastChanceResolve(DefaultBeanContext.java:3254)

Steps To Reproduce

  1. git clone https://github.com/tobiasschaefer/bug-interceptor-registry.git

  2. Setup

sdk use java 21.3.0.r17-grl
export PATH=/Library/Java/JavaVirtualMachines/graalvm-ce-java17-21.3.0/Contents/Home/bin:$PATH
export JAVA_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java17-21.3.0/Contents/Home 
  1. Create reflection configuration

Create the native image configuration with the following steps and cancel with Ctrl-C when the application is running:

./gradlew clean build
rm -rf src/main/resources/META-INF/native-image/
mkdir -p src/main/resources/META-INF/native-image/
java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image/ -jar build/libs/context-0.1-all.jar

(or simply execute the provided script ./create-reflection-config.sh)

  1. Create image

Create image with ./gradlew clean nativeCompile

  1. Run image

Starting the native application with build/native/nativeCompile/contextfails with the error mentioned above.

Environment Information

  • MacOS 12.01
  • JDK 17 - GraalVM (also occurs on JDK 11)
  • Micronaut 3.2.0 (also occurs on 3.1.x and 3.0.x) - works with Micronaut 2.5.x

Example Application

https://github.com/tobiasschaefer/bug-interceptor-registry.git

Version

3.2.0

About this issue

  • Original URL
  • State: open
  • Created 3 years ago
  • Comments: 17 (5 by maintainers)

Commits related to this issue

Most upvoted comments

right, the reason is normally a classpath issue where you have multiple versions of the same JAR on your classpath

Hey guys i think i found the reason. I ran into this error when writing a new library (mn 3.8.5) and used it with an older application (mn 3.7.4). Bringing the mn application version to the version of the mn library resolved it for me.

It actually didn’t work in 2.5.x you actually ended up with duplicate beans everywhere but there just happened to not manifest as a non unique bean exception by chance