如何使用 Kotlin 在 SpringBoot 应用程序中设置和读取属性?

How do I set and read properties in a SpringBoot application using Kotlin?

我是一名 Java 开发人员,刚接触 Kotlin,我正在尝试访问我在 application.yml 文件中设置的值。

application.yml

q:
   client:
      apiUrl: https://app.abc.com/api/integr/v1.0
      apiToken: abc
      apiSecret: abc
      authEmail: abc@example.com
      sourceName: abc

这是我的配置 class,它遵循与 Java 类似的模式。

@Component
@FeignClient(name = "q", url = "${q.client.api-url}")
interface QClient {

@PostMapping("/user/get")
fun findUser(@RequestBody request: QRequest?): 
QResponse<List<QUser?>?>

@PostMapping("/user/delete")
fun deleteUser(@RequestBody request: QRequest?): QResponse<DeleteResponse?>?

@Configuration
class QConfig {
    @Value("${q.client.apiToken}")
    private val apiToken: String? = null

    @Value("${q.client.apiSecret}")
    private val apiSecret: String? = null

    @Value("${q.client.authEmail}")
    private val authEmail: String? = null

    @Value("${q.client.sourceName}")
    private val sourceName: String? = null

    fun createAuthRequest(): QAuth {
        return QAuth(apiToken, apiSecret, authEmail, sourceName)
    }
 }

我不想将 null 指定为实例变量的默认值,但 Kotlin 希望我这样声明它们以避免空引用。

我需要创建一个授权请求,我正在从主 class.

调用配置 class
private fun generateRequest(email: String): QRequest {
    val config = QClient.QConfig()
    val auth = config.createAuthRequest()
    return QRequest(auth, email)
}

但是在调试时它只是 returns 个空值。

所以在谷歌搜索之后,我改变了我的方法并将所有键值设置为 QConfig class 的参数,如下所示:

 @Configuration
 class QConfig(
  @Value("${q.client.apiToken}") private val apiToken: String,
  @Value("${q.client.apiSecret}") private val apiSecret: String,
  @Value("${q.client.authEmail}") private val authEmail: String,
  @Value("${q.client.sourceName}") private val sourceName: String
  ) {
      fun createAuthRequest(): QAuth {
        return QAuth(apiToken, apiSecret, authEmail, sourceName)
    }
  }

我在这里遇到的问题是它充当构造函数并希望我在为 class 上的 QConfig class 创建实例时传递参数,我不会这样做主要有 class.

如何从 application.yml 获取值并从实例变量访问它们?

我用 Joffrey 的回复解决了这个问题,我使用了这种格式的配置文件

@Component
@Configuration
class QConfig {

    @Value("${q.client.apiToken}")
    private val apiToken: String? = null

    @Value("${q.client.apiSecret}")
    private val apiSecret: String? = null

    @Value("${q.client.authEmail}")
    private val authEmail: String? = null

    @Value("${q.client.sourceName}")
    private val sourceName: String? = null

    fun createAuthRequest(): QAuth {
    return QAuth(apiToken, apiSecret, authEmail, sourceName)
    }
}

然后在 main class

上创建了这样的 QConfig 实例
@Autowired
val config = QConfig()

不好意思,尝试手动创建 class 的引用而不是使用 AutoWire。启动时,它将传递给 .yml 文件的所有环境变量拉入局部变量。

您可以使用 @ConfigurationProperties (ref)

@ConfigurationProperties("q.client")
@ConstructorBinding
data class ClientConfig(
    val apiUrl: String, // variable name should be same as the one defined in application.yaml
    val apiToken: String,
    ...other properties
)


@SpringBootApplication
@ConfigurationPropertiesScan
class SpringWhosebugApplication {

    @Autowired
    private lateinit var clientConfig: ClientConfig

    @EventListener(ApplicationReadyEvent::class)
    fun doSomething() {
        println("FOOBAR: $clientConfig")
    }
}

fun main(args: Array<String>) {
    runApplication<SpringWhosebugApplication>(*args)
}