Search code examples
micronautvault

Micronaut Vault Config Client gives no bean of type SerdeConfiguration exists error


I want to pull configurations from Vault and got the below error while starting my app by enabling Config Client and Vault. The no SerdeConfiguration bean error happened even before hitting the Vault server.

I wonder whether I missed anything on the bootstrap.yml or was supposed to provide a custom SerdeConfiguration.

Message: No bean of type [io.micronaut.serde.config.SerdeConfiguration] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Path Taken: 
new DistributedPropertySourceLocator(ConfigurationClient configurationClient,Duration readTimeout)
--> new DistributedPropertySourceLocator([ConfigurationClient configurationClient],Duration readTimeout)
--> new DefaultCompositeConfigurationClient([ConfigurationClient[] configurationClients])
--> new VaultConfigurationClient([VaultConfigHttpClient configHttpClient],VaultClientConfiguration vaultClientConfiguration,ApplicationConfiguration applicationConfiguration,ExecutorService executorService)
--> new VaultConfigHttpClientV1$Intercepted(BeanResolutionContext $beanResolutionContext,BeanContext $beanContext,Qualifier $qualifier,[List $interceptors])
--> new HttpClientIntroductionAdvice([HttpClientRegistry clientFactory],JsonMediaTypeCodec jsonMediaTypeCodec,List transformers,HttpClientBinderRegistry binderRegistry,ConversionService conversionService)
--> new DefaultNettyHttpClientRegistry(HttpClientConfiguration defaultHttpClientConfiguration,HttpClientFilterResolver httpClientFilterResolver,LoadBalancerResolver loadBalancerResolver,NettyClientSslBuilder nettyClientSslBuilder,ThreadFactory threadFactory,MediaTypeCodecRegistry codecRegistry,EventLoopGroupRegistry eventLoopGroupRegistry,EventLoopGroupFactory eventLoopGroupFactory,BeanContext beanContext,List invocationInstrumenterFactories,[JsonMapper jsonMapper])
--> new JacksonJsonMapper([SerdeRegistry registry])
--> new DefaultSerdeRegistry(BeanContext beanContext,[ObjectSerializer objectSerializer],ObjectDeserializer objectDeserializer,Serde objectArraySerde,SerdeIntrospections introspections)
--> new ObjectSerializer([SerdeIntrospections introspections],SerializationConfiguration configuration)
--> new DefaultSerdeIntrospections([SerdeConfiguration configuration])
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [configuration] of class: io.micronaut.serde.support.DefaultSerdeIntrospections

Below is my bootstrap.yml

micronaut:
  application:
    name: my-app
  config-client:
    enabled: true 

vault:
  client:
    uri: http://localhost:8200
    token: hvs.ugHfHLMdA3PBJT6K2GjVdJZ4
    kv-version: V1 
    config:
      enabled: true

I tried adding micronaut.serde.* configurations on the bootstrap.yml with hoping SerdeConfiguration is injected, but saw no difference.

Below link shows possible SerdeConfiguration user can setup though. https://micronaut-projects.github.io/micronaut-serialization/latest/guide/configurationreference.html

Here the Micronaut version and the maven compiler plugin setup I have

    <parent>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-parent</artifactId>
        <version>3.8.3</version>
    </parent>

    <properties>
        <packaging>jar</packaging>
        <jdk.version>17</jdk.version>
        <release.version>17</release.version>
        <micronaut.version>3.8.3</micronaut.version>
        <micronaut.runtime>netty</micronaut.runtime>
        <micronaut.data.version>3.9.4</micronaut.data.version>
        <micronaut.security.version>3.9.2</micronaut.security.version>
        <micronaut.serialization.version>1.5.0</micronaut.serialization.version>
                     :


  <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
          <annotationProcessorPaths combine.children="append">
              <path>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>${lombok.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-inject-java</artifactId>
                  <version>${micronaut.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut.data</groupId>
                  <artifactId>micronaut-data-processor</artifactId>
                  <version>${micronaut.data.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-graal</artifactId>
                  <version>${micronaut.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-http-validation</artifactId>
                  <version>${micronaut.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-validation</artifactId>
                  <version>${micronaut.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut.data</groupId>
                  <artifactId>micronaut-data-r2dbc</artifactId>
                  <version>${micronaut.data.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-http-client-core</artifactId>
                  <version>${micronaut.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut.discovery</groupId>
                  <artifactId>micronaut-discovery-client</artifactId>
                  <version>3.2.0</version>
              </path>
              <path>
                  <groupId>io.micronaut.serde</groupId>
                  <artifactId>micronaut-serde-processor</artifactId>
                  <version>${micronaut.serialization.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut.serde</groupId>
                  <artifactId>micronaut-serde-api</artifactId>
                  <version>${micronaut.serialization.version}</version>
              </path>
              <path>
                  <groupId>io.micronaut.security</groupId>
                  <artifactId>micronaut-security-annotations</artifactId>
                  <version>${micronaut.security.version}</version>
              </path>
          </annotationProcessorPaths>
          <compilerArgs>
              <arg>-Amicronaut.processing.group=com.test</arg>
              <arg>-Amicronaut.processing.module=my-app</arg>
          </compilerArgs>
      </configuration>
  </plugin>

Solution

  • The resolution of this issue was achieved through a straightforward upgrade to Micronaut version 4, with no necessary changes in the codebase. Following the upgrade, the retrieval and application of database configurations from the Vault proceeded seamlessly.

    [ pom.xml ]

    <parent>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-parent</artifactId>
        <version>4.0.0-M1</version>
        <relativePath />
    </parent>
    
    <properties>
        <packaging>jar</packaging>
        <jdk.version>17</jdk.version>
        <release.version>17</release.version>
        <micronaut.version>4.0.0-M1</micronaut.version>
        <micronaut.core.version>4.0.0-M1</micronaut.core.version>
        <micronaut.validation.version>4.0.0-M1</micronaut.validation.version>
        <micronaut.serialization.version>2.0.0-M1</micronaut.serialization.version>
        <micronaut.runtime>netty</micronaut.runtime>
    
                        :
    <build>
        <plugins>
            <plugin>
                <groupId>io.micronaut.build</groupId>
                <artifactId>micronaut-maven-plugin</artifactId>
                <configuration>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <release>17</release>
                    <annotationProcessorPaths combine.children="append">
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-context</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-inject</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-inject-java</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.validation</groupId>
                            <artifactId>micronaut-validation-processor</artifactId>
                            <version>${micronaut.validation.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.data</groupId>
                            <artifactId>micronaut-data-processor</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-graal</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-http-validation</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.validation</groupId>
                            <artifactId>micronaut-validation</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.data</groupId>
                            <artifactId>micronaut-data-r2dbc</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-http-client-core</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.discovery</groupId>
                            <artifactId>micronaut-discovery-client</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.serde</groupId>
                            <artifactId>micronaut-serde-processor</artifactId>
                            <version>${micronaut.serialization.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.serde</groupId>
                            <artifactId>micronaut-serde-api</artifactId>
                            <version>${micronaut.serialization.version}</version>
                        </path>
                        <path>
                            <groupId>io.micronaut.security</groupId>
                            <artifactId>micronaut-security-annotations</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-Amicronaut.processing.group=com.test</arg>
                        <arg>-Amicronaut.processing.module=my-app</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
    
             :
    
    <dependencies>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject-java</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-context</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.validation</groupId>
            <artifactId>micronaut-validation</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-client</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-server-netty</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-runtime</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.micronaut</groupId>
                    <artifactId>micronaut-jackson-databind</artifactId>
                </exclusion>
            </exclusions>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.data</groupId>
            <artifactId>micronaut-data-processor</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.data</groupId>
            <artifactId>micronaut-data-r2dbc</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.flyway</groupId>
            <artifactId>micronaut-flyway</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.serde</groupId>
            <artifactId>micronaut-serde-jackson</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.sql</groupId>
            <artifactId>micronaut-jdbc-ucp</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.security</groupId>
            <artifactId>micronaut-security-jwt</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.discovery</groupId>
            <artifactId>micronaut-discovery-client</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-management</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-retry</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micronaut.micrometer</groupId>
            <artifactId>micronaut-micrometer-core</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micronaut.micrometer</groupId>
            <artifactId>micronaut-micrometer-registry-statsd</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micronaut.micrometer</groupId>
            <artifactId>micronaut-micrometer-registry-jmx</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.r2dbc</groupId>
            <artifactId>r2dbc-pool</artifactId>
        </dependency>
    
             :
    

    [ bootstrap.yml ]

    micronaut:
      application:
        name: my-app
      config-client:
        enabled: true 
      security:
        enabled: true
        authentication: BEARER
        basic-auth:
          enabled: false
        token:
          enabled: true
          jwt:
            bearer:
              enabled: true
            signatures:
              secret:
                generator:
                  secret: secret0123456789
      metrics:
        enabled: true
      binders:
        files:
          enabled: true
        jdbc:
          enabled: true
        jvm:
          enabled: true
        logback:
          enabled: true
        processor:
          enabled: true
        uptime:
          enabled: true
        web:
          enabled: true
      server:
        port: 7777
    vault:
      client:
        uri: http://localhost:8200
        token: hvs.kSWIif3OlAHh1SBu1nBCQQ0N
        kv-version: V1
        config:
          enabled: true
    

    [ application.yml ]

    r2dbc:
      datasources:
        default:
          url: ${R2DBC_URL}
          username: ${R2DBC_USERNAME}
          password: ${R2DBC_PASSWORD}
          dialect: ORACLE
    
    datasources:
      default:
        url: ${JDBC_URL}
        username: ${JDBC_USERNAME}
        password: ${JDBC_PASSWORD}
        dialect: ORACLE
        driver-class-name: oracle.jdbc.driver.OracleDriver
    
    flyway:
      datasources:
        default:
          enabled: true
        
    

    [ application log ]

    12:44:18.218 [main] DEBUG i.m.d.v.c.VaultConfigurationClient - Vault server endpoint: http://localhost:8200, secret engine version: V1, secret-engine-name: secret, vault keys path prefix: 
    12:44:18.218 [main] DEBUG i.m.d.v.c.VaultConfigurationClient - Application name: my-app, application profiles: []
                :
    12:44:18.503 [default-nioEventLoopGroup-1-2] DEBUG i.m.h.client.netty.DefaultHttpClient - Sending HTTP GET to http://localhost:8200/v1/secret/my-app
    12:44:18.505 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - X-Vault-Token: *MASKED*
    12:44:18.505 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Accept: application/json
    12:44:18.505 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - host: localhost:8200
    12:44:18.505 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - connection: keep-alive
                :
    12:44:18.524 [default-nioEventLoopGroup-1-2] DEBUG i.m.h.client.netty.DefaultHttpClient - Received response 200 from http://localhost:8200/v1/secret/my-app
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - HTTP Client Response Received (200 OK) for Request: GET http://localhost:8200/v1/secret/my-app
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Cache-Control: no-store
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Content-Type: application/json
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Strict-Transport-Security: max-age=31536000; includeSubDomains
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Date: Wed, 17 Jan 2024 20:44:18 GMT
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Content-Length: 510
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - Response Body
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - ----
    12:44:18.525 [default-nioEventLoopGroup-1-2] TRACE i.m.h.client.netty.DefaultHttpClient - {"request_id":"4c2f3ed3-bf6e-05d4-f91b-9d485b55becf","lease_id":"","renewable":false,"lease_duration":2764800,"data":{"datasources":{"default":{"dialect":"ORACLE","driver-class-name":"oracle.jdbc.driver.OracleDriver","password":"pass","url":"jdbc:oracle:thin:@//localhost:1521/mydb","username":"user123"}},"r2dbc":{"datasources":{"default":{"dialect":"ORACLE","password":"pass","url":"r2dbc:oracle://localhost:1521/mydb","username":"user123"}}}},"wrap_info":null,"warnings":null,"auth":null}