Преобразование типа Typesafe Config в java.util.Properties

Название говорит само за себя, у меня есть объект конфигурации (от https://github.com/typesafehub/config), и я хочу передать ему конструктор, который поддерживает только java.util.Properties в качестве аргумента. Есть ли простой способ преобразовать конфигурацию в объект свойств?


person arnaud briche    schedule 17.12.2015    source источник


Ответы (4)


Вот способ преобразования типа объекта Config в java-объект Properties. Я тестировал его только в простом случае создания свойств 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 для получения плоского списка свойств и развернутый значения записи, которое дает объект, тип которого зависит от значения конфигурации.

person Christian Perez-Llamas    schedule 24.01.2016

Вы можете попробовать мою оболочку scala https://github.com/andr83/scalaconfig. С его помощью преобразовать объект конфигурации в свойства Java просто:

val properties = config.as[Properties]
person andr83    schedule 29.10.2016
comment
Это должно быть частью конфигурации imho - person Jeroen Vlek; 29.06.2017

Поскольку typesafe config/hocon поддерживает гораздо более богатую структуру, чем java.util.propeties, будет сложно получить безопасное преобразование.

Или говоря иначе, поскольку properties может выражать только подмножество hocon, преобразование не ясно, так как оно может привести к потере информации.

Итак, если ваша конфигурация довольно плоская и не содержит utf-8, вы можете преобразовать hocon в json, а затем извлечь значения.

Лучшим решением было бы реализовать ConfigClass и заполнить значения значениями из hocon и передать их классу, который вы хотите настроить.

person Andreas Neumann    schedule 17.12.2015
comment
Да, я знаю об этом несоответствии модели данных. Я надеялся, что Config или ConfigObject могут иметь своего рода метод flatten. На самом деле, я хочу настроить потребителя Kafka из моего объекта конфигурации, а потребитель Kafka принимает свойства в качестве аргумента; поэтому я более или менее уверен, что часть моей конфигурации, идущая к потребителю, не будет вложенной. - person arnaud briche; 17.12.2015

Это невозможно напрямую через конфигурацию typesafe. Даже преобразование всего файла 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

Пример хокон:

  http {
   port = "9000"
   port = ${?HTTP_PORT}
 }

Конфигурация typesafe проанализирует это на

{
  "http": {
    "port": "9000,${?HTTP_PORT}"
  }
}

Однако, если вы попытаетесь проанализировать это в hocon, вы получите синтаксическую ошибку. , не может быть там. Правильный анализ hocon будет 9000${?HTTP_PORT} - без запятой между значениями. Я считаю, что это верно для всех конкатенаций и замещений массивов.

person Louis B    schedule 22.09.2020