Search code examples
kotlinmicronaut

Using data class in micronaut properties


I'm writing configuration properties and would like to use data class to hold the data.

Problem is, data classes have a primary constructor and are immutable, and micronaut tries to inject the values as beans.

Example:

@ConfigurationProperties("gerencianet")
data class GerenciaNetConfiguration(

    val clientId: String,

    val clientSecret: String,

    val apiUrl: String,

    val notificationUrl: String,

    val datePattern: String = "yyyy-MM-dd HH:mm:ss"

)

Error: Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [java.lang.String] exists. Make sure the bean is not disabled by bean requirements

Is there support for it?


Solution

  • One option you have is to do something like this:

    import io.micronaut.context.annotation.ConfigurationBuilder
    import io.micronaut.context.annotation.ConfigurationProperties
    
    @ConfigurationProperties("my.engine")
    internal class EngineConfig {
        @ConfigurationBuilder(prefixes = ["with"])
        val builder = EngineImpl.builder()
    
        @ConfigurationBuilder(prefixes = ["with"], configurationPrefix = "crank-shaft") / <3>
        val crankShaft = CrankShaft.builder()
    
        @set:ConfigurationBuilder(prefixes = ["with"], configurationPrefix = "spark-plug") 
        var sparkPlug = SparkPlug.builder()
    }
    
    

    That is from our test suite at https://github.com/micronaut-projects/micronaut-core/blob/1c3e2c3280da200c96e629a4edb9df87875ef2ff/test-suite-kotlin/src/test/kotlin/io/micronaut/docs/config/builder/EngineConfig.kt.

    You can also inject the values as constructor parameters using @Value.

    I hope that helps.