将 Typesafe Config 类型转换为 java.util.Properties

2022-09-03 06:45:06

标题本身就说话,我有一个Config对象(来自 https://github.com/typesafehub/config),我想把它传递给一个只支持java.util.Properties作为参数的构造函数。有没有一种简单的方法可以将Config转换为属性对象?


答案 1

下面是将类型安全配置对象转换为属性 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"
  }
}

您可以创建相应的属性对象,如下所示:

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 来获取属性的扁平化列表,以及 entry 值的解包,它给出了一个对象,其类型取决于配置值。


答案 2

你可以试试我的scala包装器 https://github.com/andr83/scalaconfig。使用它将配置对象转换为java属性很简单:

val properties = config.as[Properties]

推荐