将Typesafe配置类型转换为java.util.Properties
标题本身就说明了这一点,我有一个Config对象(from),我想将它传递给一个构造函数,该构造函数只支持java.util.Properties作为参数。将Typesafe配置类型转换为java.util.Properties,java,scala,typesafe,Java,Scala,Typesafe,标题本身就说明了这一点,我有一个Config对象(from),我想将它传递给一个构造函数,该构造函数只支持java.util.Properties作为参数。 有没有一种简单的方法可以将配置转换为属性对象?因为typesafe配置/hocon支持比java.util.Properties更丰富的结构,所以很难实现安全的转换 或以其他方式称为属性只能表示hocon的子集。转换不清楚,因为它可能会丢失信息 因此,如果您的配置相当简单,并且不包含utf-8,那么您可以将hocon转换为json,然后提取
有没有一种简单的方法可以将配置转换为属性对象?因为
typesafe配置
/hocon
支持比java.util.Properties
更丰富的结构,所以很难实现安全的转换
或以其他方式称为属性
只能表示hocon
的子集。转换不清楚,因为它可能会丢失信息
因此,如果您的配置相当简单,并且不包含utf-8
,那么您可以将hocon
转换为json
,然后提取值
更好的解决方案是实现一个
ConfigClass
,用来自hocon的值填充值,并将其传递给要配置的类。下面是一种将typesafe配置对象转换为Properties java对象的方法。我只在创建卡夫卡属性的简单案例中对其进行了测试
在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包装器。使用它将配置对象转换为java属性很简单:
val properties = config.as[Properties]
直接通过类型安全配置是不可能的。即使将整个hocon文件转换为json,也能提供真正有效的json: 例: 该格式直接来自
Config.render
如您所见,disabled
用hocon风格的语法表示了两次
我在渲染hocon->json->hocon时也遇到问题
hocon示例:
http {
port = "9000"
port = ${?HTTP_PORT}
}
typesafe配置会将其解析为
{
"http": {
"port": "9000,${?HTTP_PORT}"
}
}
但是,如果您试图在hocon中解析它,它会抛出一个语法错误。,
不能在那里。
hocon正确的解析应该是
9000${?HTTP_PORT}
——值之间没有逗号。我相信这对所有数组连接和替换都是正确的是的,我知道这种数据模型不匹配。我希望Config或ConfigObject可能有一种“展平”方法。实际上,我想从我的配置对象配置一个Kafka使用者,Kafka使用者将属性作为参数;因此,我或多或少地确定,我的配置文件中发送给消费者的部分不会被嵌套。这应该是配置文件imho的一部分
{
"http": {
"port": "9000,${?HTTP_PORT}"
}
}