在 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()
}
您还可以使用 @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()
}
}
我正在编写配置属性并想使用数据 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()
}
您还可以使用 @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()
}
}