将Typesafe配置类型转换为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,然后提取

标题本身就说明了这一点,我有一个Config对象(from),我想将它传递给一个构造函数,该构造函数只支持java.util.Properties作为参数。
有没有一种简单的方法可以将配置转换为属性对象?

因为
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}"
  }
}