HOCON配置文件动态替换
HOCON config file dynamic substitution
我正在使用 HOCON 配置日志消息,并且正在寻找一种动态替换占位符值的方法。
我知道当 PLACEHOLDER
环境变量不存在时,${?PLACEHOLDER}
将读取一个环境变量,而 returns 将读取一个空字符串。
例子
这是我想到的例子:
(我正在使用 config4k
加载 HOCON)
data class LogMessage(val message: String, val code: String)
fun getMessage(key: String, placeholderValues: Array<String> = arrayOf()): LogMessage {
val config = ConfigFactory.parseString("MY_LOG_MESSAGE {code = ABC-123456, message = My log message with dynamic value %0% and another dynamic value %1% }")
val messageObject = config.extract<LogMessage>(key)
var message = messageObject.message
placeholderValues.forEachIndexed { placeholderIndex, value ->
message = message.replace("%$placeholderIndex%", value)
}
return messageObject.copy(message = message)
}
fun main(args: Array<String>) {
println(getMessage("MY_LOG_MESSAGE", arrayOf("value 1", "value 2")))
// prints: LogMessage(message=My log message with dynamic value value 1 and another dynamic value value 2, code=ABC-123456)
}
尽管这可行,但它看起来不是最佳解决方案,我认为已经有解决方案。
有人可以告诉我是否有内置解决方案吗?
要事第一。
HOCON 只是一种美化的 JSON 格式。
config4k 只是一个包装器。
你的所有工作都由 Typesafe Config 完成,你可能已经注意到了。
从他们的文档和代码来看,他们只支持来自文件或环境的占位符:
This library limits itself to config files. If you want to load config
from a database or something, you would need to write some custom
code.
但是对于您正在做的事情,简单的 String.format()
应该就足够了:
fun interpolate(message: String, vararg args: Any) = String.format(message, *args)
println(interpolate("My message was %s %s %s %s", "a", 1, 3.32, true))
// My message was a 1 3.32 true
请注意,您可以使用 *
来解构数组。
我正在使用 HOCON 配置日志消息,并且正在寻找一种动态替换占位符值的方法。
我知道当 PLACEHOLDER
环境变量不存在时,${?PLACEHOLDER}
将读取一个环境变量,而 returns 将读取一个空字符串。
例子
这是我想到的例子:
(我正在使用 config4k
加载 HOCON)
data class LogMessage(val message: String, val code: String)
fun getMessage(key: String, placeholderValues: Array<String> = arrayOf()): LogMessage {
val config = ConfigFactory.parseString("MY_LOG_MESSAGE {code = ABC-123456, message = My log message with dynamic value %0% and another dynamic value %1% }")
val messageObject = config.extract<LogMessage>(key)
var message = messageObject.message
placeholderValues.forEachIndexed { placeholderIndex, value ->
message = message.replace("%$placeholderIndex%", value)
}
return messageObject.copy(message = message)
}
fun main(args: Array<String>) {
println(getMessage("MY_LOG_MESSAGE", arrayOf("value 1", "value 2")))
// prints: LogMessage(message=My log message with dynamic value value 1 and another dynamic value value 2, code=ABC-123456)
}
尽管这可行,但它看起来不是最佳解决方案,我认为已经有解决方案。
有人可以告诉我是否有内置解决方案吗?
要事第一。
HOCON 只是一种美化的 JSON 格式。
config4k 只是一个包装器。
你的所有工作都由 Typesafe Config 完成,你可能已经注意到了。
从他们的文档和代码来看,他们只支持来自文件或环境的占位符:
This library limits itself to config files. If you want to load config from a database or something, you would need to write some custom code.
但是对于您正在做的事情,简单的 String.format()
应该就足够了:
fun interpolate(message: String, vararg args: Any) = String.format(message, *args)
println(interpolate("My message was %s %s %s %s", "a", 1, 3.32, true))
// My message was a 1 3.32 true
请注意,您可以使用 *
来解构数组。