如何使用 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)
}
我是一名 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.
调用配置 classprivate 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)
}