Son*_*que 33 spring kotlin spring-boot
如何使用Kotlin在Spring Boot中正确初始化ConfigurationProperties ?
目前我喜欢以下示例:
@ConfigurationProperties("app")
class Config {
var foo: String? = null
}
Run Code Online (Sandbox Code Playgroud)
但它看起来很丑陋,实际上foo
并不是一个var
可行的,foo是不变的 val
,应该在启动时初始化,并且将来不会改变.
Ray*_*ter 38
以下是我使用application.yml文件的方法.
myconfig:
my-host: ssl://example.com
my-port: 23894
my-user: user
my-pass: pass
Run Code Online (Sandbox Code Playgroud)
这是kotlin文件:
@Configuration
@ConfigurationProperties(prefix = "myconfig")
class MqttProperties {
lateinit var myHost: String
lateinit var myPort: String
lateinit var myUser: String
lateinit var myPass: String
}
Run Code Online (Sandbox Code Playgroud)
这对我很有用.
Vla*_*tem 11
在带有 Kotlin 1.4.3 的 Spring Boot 2.4.3 上,下一个方法不再有效(可能是因为错误):
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.EnableConfigurationProperties
@SpringBootApplication
@EnableConfigurationProperties(TestProperties::class)
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
Run Code Online (Sandbox Code Playgroud)
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
@ConfigurationProperties(prefix = "test")
@ConstructorBinding
data class TestProperties(
val value: String
)
Run Code Online (Sandbox Code Playgroud)
上面的代码在暗示接下来两种方法之一后开始工作:
implementation("org.jetbrains.kotlin:kotlin-reflect")
Run Code Online (Sandbox Code Playgroud)
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
@ConfigurationProperties(prefix = "test")
data class TestProperties @ConstructorBinding constructor(
val value: String
)
Run Code Online (Sandbox Code Playgroud)
问题发生在 org/springframework/boot/context/properties/ConfigurationPropertiesBindConstructorProvider.java#68 行
s1m*_*nw1 10
正如文档中所述:必须提供" Java Bean "才能使用ConfigurationProperties
.这意味着您的属性需要具有getter和setter,因此val
目前无法实现.
getter和setter通常是必需的,因为绑定是通过标准的Java Beans属性描述符,就像在Spring MVC中一样.有些情况下可能会省略一个二传手[...]
虽然有一个与Kotlin相关的开放性问题:https://github.com/spring-projects/spring-boot/issues/8762
使用新的Spring Boot 2.2,您可以这样:
@ConstructorBinding
@ConfigurationProperties(prefix = "swagger")
data class SwaggerProp(
val title: String, val description: String, val version: String
)
Run Code Online (Sandbox Code Playgroud)
并且不要忘记在依赖项中包含此内容build.gradle.kts
:
dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
}
Run Code Online (Sandbox Code Playgroud)
@ConstructorBinding
@ConfigurationProperties(prefix = "your.prefix")
data class AppProperties (
val invoiceBaseDir: String,
val invoiceOutputFolderPdf: String,
val staticFileFolder: String
)
Run Code Online (Sandbox Code Playgroud)
不要忘记添加@ConfigurationPropertiesScan
@ConfigurationPropertiesScan
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
Run Code Online (Sandbox Code Playgroud)
最后是 application.properties 文件:
your.prefix.invoiceBaseDir=D:/brot-files
your.prefix.invoiceOutputFolderPdf=invoices-pdf
your.prefix.staticFileFolder=static-resources
Run Code Online (Sandbox Code Playgroud)
@Value("\${some.property.key:}")
lateinit var foo:String
Run Code Online (Sandbox Code Playgroud)
可以这样用
从Spring Boot 3.0开始,如果您有一个构造函数,则不再需要使用@ConstructorBinding
注释。
@ConfigurationProperties("app")
data class Config(
val foo: String = "default foo"
)
Run Code Online (Sandbox Code Playgroud)
更多信息在这里
归档时间: |
|
查看次数: |
15738 次 |
最近记录: |