在Micronaut属性中使用数据类

时间:2019-07-14 17:12:47

标签: kotlin micronaut

我正在编写配置属性,并希望使用数据类来保存数据。

问题是,数据类具有主构造函数且是不可变的,并且micronaut尝试将值作为bean注入。

示例:

@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"

)

错误: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

有支持吗?

2 个答案:

答案 0 :(得分:0)

您可以选择执行以下操作:

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()
}

这是从我们位于https://github.com/micronaut-projects/micronaut-core/blob/1c3e2c3280da200c96e629a4edb9df87875ef2ff/test-suite-kotlin/src/test/kotlin/io/micronaut/docs/config/builder/EngineConfig.kt的测试套件中获得的。

您还可以使用@Value将这些值作为构造函数参数注入。

我希望有帮助。

答案 1 :(得分:0)

您可以使用@Parameter将值作为构造函数参数注入。 avoids common mistakes with @Value

例如,如果您的application.yml如下所示:

group:
  first-value: asdf
  second-value: ghjk

然后Kotlin类可能如下:

import io.micronaut.context.annotation.Property
import javax.inject.Singleton

@Singleton
class MyClass(@Property(name = "group.first-value") val firstValue: String) {
    fun doIt(): String {
        return firstValue
    }
}

或者类似的方法:

import io.micronaut.context.annotation.Factory
import io.micronaut.context.annotation.Property
import javax.inject.Singleton

@Factory
class MyFactory {
    @Singleton
    fun getSomeValue(@Property(name = "group.first-value") firstValue: String): SomeClass {
        return SomeClass.newBuilder()
            .setTheValue(firstValue)
            .build()
    }
}