如何在 Ktor 中使用自定义配置?
How do I use custom configuration in Ktor?
我正在研究内置配置支持,并想使用它(而不是仅仅将我自己的配置与 Ktor 的一起使用),但我很难弄清楚如何以一种干净的方式来实现它.我得到了这个,它正在工作,但它真的很难看,我觉得必须有更好的方法:
val myBatisConfig = MyBatisConfig(
environment.config.property("mybatis.url").getString(),
environment.config.property("mybatis.driver").getString(),
environment.config.property("mybatis.poolSize").getString().toInt())
installKoin(listOf(mybatisModule(myBatisConfig), appModule), logger = SLF4JLogger())
感谢您的帮助!
好的,我想我现在有一个很好的、干净的方法来做这件事。诀窍是不要费心浏览框架本身。您可以非常轻松地获得整个配置,如这些很棒的 HOCON 文件:
val config = ConfigFactory.load()
然后您可以自己遍历树并构建您的对象,或者使用一个名为 config4k
的项目来构建您的模型 类。因此,我上面的设置添加了更多配置,但变得更简单且更易于维护:
installKoin(listOf(
mybatisModule(config.extract("mybatis")),
zendeskModule(config.extract("zendesk")),
appModule),
logger = SLF4JLogger())
希望有人觉得这有用!
您也可以试试这个解决方案:
class MyService(val url: String)
fun KoinApplication.loadMyKoins(environment: ApplicationEnvironment): KoinApplication {
val myFirstModule = module {
single { MyService(environment.config.property("mybatis.url").getString()) }
}
val mySecondModule = module {}
return modules(listOf(myFirstModule, mySecondModule))
}
fun Application.main() {
install(DefaultHeaders)
install(Koin) {
loadMyKoins(environment)
SLF4JLogger()
}
routing {
val service by inject<MyService>()
get("/") {
call.respond("Hello world! This is my service url: ${service.url}")
}
}
}
fun main(args: Array<String>) {
embeddedServer(Netty, commandLineEnvironment(args)).start()
}
添加到现有的已接受答案中。使用 ConfigFactory.load()
的实现可能如下所示(没有库):
object Config {
@KtorExperimentalAPI
val config = HoconApplicationConfig(ConfigFactory.load())
@KtorExperimentalAPI
fun getProperty(key: String): String? = config.propertyOrNull(key)?.getString()
@KtorExperimentalAPI
fun requireProperty(key: String): String = getProperty(key)
?: throw IllegalStateException("Missing property $key")
}
因此,配置 class 将变为:
val myBatisConfig = MyBatisConfig(
requireProperty("mybatis.url"),
requireProperty("mybatis.driver"),
requireProperty("mybatis.poolSize").toInt())
我正在研究内置配置支持,并想使用它(而不是仅仅将我自己的配置与 Ktor 的一起使用),但我很难弄清楚如何以一种干净的方式来实现它.我得到了这个,它正在工作,但它真的很难看,我觉得必须有更好的方法:
val myBatisConfig = MyBatisConfig(
environment.config.property("mybatis.url").getString(),
environment.config.property("mybatis.driver").getString(),
environment.config.property("mybatis.poolSize").getString().toInt())
installKoin(listOf(mybatisModule(myBatisConfig), appModule), logger = SLF4JLogger())
感谢您的帮助!
好的,我想我现在有一个很好的、干净的方法来做这件事。诀窍是不要费心浏览框架本身。您可以非常轻松地获得整个配置,如这些很棒的 HOCON 文件:
val config = ConfigFactory.load()
然后您可以自己遍历树并构建您的对象,或者使用一个名为 config4k
的项目来构建您的模型 类。因此,我上面的设置添加了更多配置,但变得更简单且更易于维护:
installKoin(listOf(
mybatisModule(config.extract("mybatis")),
zendeskModule(config.extract("zendesk")),
appModule),
logger = SLF4JLogger())
希望有人觉得这有用!
您也可以试试这个解决方案:
class MyService(val url: String)
fun KoinApplication.loadMyKoins(environment: ApplicationEnvironment): KoinApplication {
val myFirstModule = module {
single { MyService(environment.config.property("mybatis.url").getString()) }
}
val mySecondModule = module {}
return modules(listOf(myFirstModule, mySecondModule))
}
fun Application.main() {
install(DefaultHeaders)
install(Koin) {
loadMyKoins(environment)
SLF4JLogger()
}
routing {
val service by inject<MyService>()
get("/") {
call.respond("Hello world! This is my service url: ${service.url}")
}
}
}
fun main(args: Array<String>) {
embeddedServer(Netty, commandLineEnvironment(args)).start()
}
添加到现有的已接受答案中。使用 ConfigFactory.load()
的实现可能如下所示(没有库):
object Config {
@KtorExperimentalAPI
val config = HoconApplicationConfig(ConfigFactory.load())
@KtorExperimentalAPI
fun getProperty(key: String): String? = config.propertyOrNull(key)?.getString()
@KtorExperimentalAPI
fun requireProperty(key: String): String = getProperty(key)
?: throw IllegalStateException("Missing property $key")
}
因此,配置 class 将变为:
val myBatisConfig = MyBatisConfig(
requireProperty("mybatis.url"),
requireProperty("mybatis.driver"),
requireProperty("mybatis.poolSize").toInt())