在 micronaut 属性中使用数据 class

Using data class in micronaut properties

我正在编写配置属性并想使用数据 class 来保存数据。

问题是,数据 classes 有一个主构造函数并且是不可变的,而 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

有支持吗?

你有一个选择是做这样的事情:

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.

将值作为构造函数参数注入

希望对您有所帮助。

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

例如,如果您的 application.yml 看起来像这样:

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

然后 Kotlin class 可能看起来像:

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