programing

Kotlin & Spring Boot @Configuration Properties

showcode 2023. 3. 21. 22:41
반응형

Kotlin & Spring Boot @Configuration Properties

Kotlin을 사용Spring Boot에서 Configuration Properties를 올바르게 초기화하는 방법

현재 아래 예시와 같이 하고 있습니다.

 @ConfigurationProperties("app")
 class Config {
     var foo: String? = null
 }

근데 좀 못생겨서foo이 아니다variable, foo는 일정합니다. value 및 시작 초기화되어야 하며 향후 변경되지 않습니다.

새로운 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
)

위의 코드는 다음 두 가지 방법 중 하나를 암시한 후 동작을 시작합니다.

  1. 종속성 추가
implementation("org.jetbrains.kotlin:kotlin-reflect")
  1. 속성 클래스 업데이트
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

반응형