Kotlin & Spring Boot @Configuration Properties
Kotlin을 사용한 Spring Boot에서 Configuration Properties를 올바르게 초기화하는 방법
현재 아래 예시와 같이 하고 있습니다.
@ConfigurationProperties("app")
class Config {
var foo: String? = null
}
근데 좀 못생겨서foo
이 아니다var
iable, foo는 일정합니다. val
ue 및 시작 시 초기화되어야 하며 향후 변경되지 않습니다.
새로운 Spring Boot 2.2에서는 다음과 같이 할 수 있습니다.
@ConstructorBinding
@ConfigurationProperties(prefix = "swagger")
data class SwaggerProp(
val title: String, val description: String, val version: String
)
그리고, 이것을 당신의 의존관계에 포함시키는 것을 잊지 마세요.build.gradle.kts
:
dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
}
application.yml 파일로 작업하는 방법은 다음과 같습니다.
myconfig:
my-host: ssl://example.com
my-port: 23894
my-user: user
my-pass: pass
다음은 kotlin 파일입니다.
@Configuration
@ConfigurationProperties(prefix = "myconfig")
class MqttProperties {
lateinit var myHost: String
lateinit var myPort: String
lateinit var myUser: String
lateinit var myPass: String
}
이게 나한테는 잘 먹혔어.
업데이트: Spring Boot 2.2.0부터는 다음과 같이 데이터 클래스를 사용할 수 있습니다.
@ConstructorBinding
@ConfigurationProperties("example.kotlin")
data class KotlinExampleProperties(
val name: String,
val description: String,
val myService: MyService) {
data class MyService(
val apiToken: String,
val uri: URI
)
}
자세한 내용은 공식 문서를 참조하십시오.
Spring Boot 2.2.0에서 폐지되어 문제가 종료되었습니다.
문서에 기재된 바와 같이 "Java Bean"을 사용해야 합니다.ConfigurationProperties
즉, 자산에는 getter와 setter가 필요합니다.따라서val
지금은 불가능합니다.
바인딩은 Spring MVC와 마찬가지로 표준 Java Beans 속성 기술자를 통해 이루어지기 때문에 일반적으로 getters와 setters는 필수입니다.설정자가 생략되는 경우가 있습니다.[...] 있습니다.
이 문제는 Spring Boot 2.2.0에서 해결되었습니다.이거는 곧 출시될 예정입니다.https://github.com/spring-projects/spring-boot/issues/8762
Spring Boot 2.4.3과 Kotlin 1.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)
}
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
@ConfigurationProperties(prefix = "test")
@ConstructorBinding
data class TestProperties(
val value: String
)
위의 코드는 다음 두 가지 방법 중 하나를 암시한 후 동작을 시작합니다.
- 종속성 추가
implementation("org.jetbrains.kotlin:kotlin-reflect")
- 속성 클래스 업데이트
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
)
이 문제는 org/springframework/boot/context/properties/ConfigurationPropertiesBindConstructorProvider.java#68 행에서 발생합니다.
@Value("\${some.property.key:}")
lateinit var foo:String
이런 식으로 사용할 수 있다
@ConstructorBinding
@ConfigurationProperties(prefix = "your.prefix")
data class AppProperties (
val invoiceBaseDir: String,
val invoiceOutputFolderPdf: String,
val staticFileFolder: String
)
추가되는 것을 잊지 마세요.@ConfigurationPropertiesScan
@ConfigurationPropertiesScan
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
마지막으로 application.properties 파일:
your.prefix.invoiceBaseDir=D:/brot-files
your.prefix.invoiceOutputFolderPdf=invoices-pdf
your.prefix.staticFileFolder=static-resources
Spring Boot 3.0에서는@ConstructorBinding
주석을 달아야 합니다.
@ConfigurationProperties("app")
data class Config(
val foo: String = "default foo"
)
자세한 내용은 이쪽
application.properties
metro.metro2.url= ######
Metro2Config.kt
@Component
@ConfigurationProperties(prefix = "metro")
data class Metro2PropertyConfiguration(
val metro2: Metro2 = Metro2()
)
data class Metro2(
var url: String ?= null
)
build.gradle
Plugins:
id 'org.jetbrains.kotlin.kapt' version '1.2.31'
// kapt dependencies required for IntelliJ auto complete of kotlin config properties class
kapt "org.springframework.boot:spring-boot-configuration-processor"
compile "org.springframework.boot:spring-boot-configuration-processor"
저는 이렇게 했습니다.
application.properties
my.prefix.myValue=1
[ My Properties ](마이프로퍼티)kt
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "my.prefix")
class MyProperties
{
private var myValue = 0
fun getMyValue(): Int {
return myValue;
}
fun setMyValue(value: Int){
myValue = value
}
}
MyService.kt
@Component
class MyService(val myProperties: MyProperties) {
fun doIt() {
System.console().printf(myProperties.getMyValue().toString())
}
}
이미 말한 내용과 더불어 주의하시기 바랍니다.val
그리고.@ConstructorBinding
에는 몇 가지 제한이 있습니다.변수에 별칭을 지정할 수 없습니다.예를 들어 Kubernetes에서 실행 중이며 env var에 의해 지정된 호스트 이름을 캡처하려고 합니다.HOSTNAME
하는 가장 은 '적용하다'입니다@Value("\${HOSTNAME}:)"
속성으로 변환되지만, 이는 가변 속성에서만 작동하며 생성자 바인딩은 없습니다.
Spring Boot Kotlin @Configuration Properties @Configuration Properties의 @Constructor Binding with @Value를 참조하십시오.
언급URL : https://stackoverflow.com/questions/45953118/kotlin-spring-boot-configurationproperties
'programing' 카테고리의 다른 글
AngularJS에서 IE 캐시를 방지하는 더 나은 방법? (0) | 2023.03.21 |
---|---|
이름이 '[DEFAULT]'인 Firebase 앱이 이미 있습니다(app/duplicate-app). (0) | 2023.03.21 |
WordPress 4.5 업데이트 후 TypeError 플러그인 던지기 (0) | 2023.03.21 |
오른쪽 다이내믹 콘텐츠를 포함한 100% 높이 좌측 사이드바 - 부트스트랩 + Wordpress (0) | 2023.03.21 |
C#에서 POST를 통해 JSON을 발송하고 반환된 JSON을 수령하시겠습니까? (0) | 2023.03.21 |