【发布时间】:2016-03-24 02:38:16
【问题描述】:
标题自言自语,我有一个 Config 对象(来自https://github.com/typesafehub/config),我想将它传递给只支持 java.util.Properties 作为参数的构造函数。 有没有一种简单的方法可以将 Config 转换为 Properties 对象?
【问题讨论】:
标题自言自语,我有一个 Config 对象(来自https://github.com/typesafehub/config),我想将它传递给只支持 java.util.Properties 作为参数的构造函数。 有没有一种简单的方法可以将 Config 转换为 Properties 对象?
【问题讨论】:
由于typesafe config/hocon 支持的结构比java.util.propeties 丰富得多,因此很难进行安全转换。
或者说因为properties只能表达hocon的一个子集,转换不清楚,可能会有信息丢失。
因此,如果您的配置相当平坦且不包含utf-8,那么您可以将hocon 转换为json,然后提取值。
更好的解决方案是实现 ConfigClass 并使用来自 hocon 的值填充值并将其传递给您要配置的类。
【讨论】:
这是一种将类型安全的Config 对象转换为Properties java 对象的方法。我只是在一个创建 Kafka 属性的简单案例中对其进行了测试。
鉴于 application.conf
中的此配置kafka-topics {
my-topic {
zookeeper.connect = "localhost:2181",
group.id = "testgroup",
zookeeper.session.timeout.ms = "500",
zookeeper.sync.time.ms = "250",
auto.commit.interval.ms = "1000"
}
}
您可以像这样创建相应的 Properties 对象:
import com.typesafe.config.{Config, ConfigFactory}
import java.util.Properties
import kafka.consumer.ConsumerConfig
object Application extends App {
def propsFromConfig(config: Config): Properties = {
import scala.collection.JavaConversions._
val props = new Properties()
val map: Map[String, Object] = config.entrySet().map({ entry =>
entry.getKey -> entry.getValue.unwrapped()
})(collection.breakOut)
props.putAll(map)
props
}
val config = ConfigFactory.load()
val consumerConfig = {
val topicConfig = config.getConfig("kafka-topics.my-topic")
val props = propsFromConfig(topicConfig)
new ConsumerConfig(props)
}
// ...
}
propsFromConfig这个函数是你主要感兴趣的,重点是使用entrySet得到一个扁平化的属性列表,条目值的展开,它给出了一个对象,其类型取决于配置值。
【讨论】:
你可以试试我的 scala 包装器https://github.com/andr83/scalaconfig。使用它将配置对象转换为 java 属性很简单:
val properties = config.as[Properties]
【讨论】:
不可能直接通过类型安全配置。即使将整个 hocon 文件转换为 json 也确实提供了一个真正有效的 json: 例如:
"play" : {
"filters" : {
"disabled" : ${?play.filters.disabled}[
"play.filters.hosts.AllowedHostsFilter"
],
"disabled" : ${?play.filters.disabled}[
"play.filters.csrf.CSRFFilter"
]
}
}
该格式直接来自Config.render
如您所见,disabled 用 hocon 样式语法表示了两次。
我也有渲染 hocon -> json -> hocon 的问题
示例 hocon:
http {
port = "9000"
port = ${?HTTP_PORT}
}
类型安全配置会将其解析为
{
"http": {
"port": "9000,${?HTTP_PORT}"
}
}
但是,如果您尝试在 hocon 中解析它 - 它会引发语法错误。 , 不能在那里。
hocon 正确解析将是 9000${?HTTP_PORT} - 值之间没有逗号。我相信这对于所有数组连接和替换都是正确的
【讨论】: