Название говорит само за себя, у меня есть объект конфигурации (от https://github.com/typesafehub/config), и я хочу передать ему конструктор, который поддерживает только java.util.Properties в качестве аргумента. Есть ли простой способ преобразовать конфигурацию в объект свойств?
Преобразование типа Typesafe Config в java.util.Properties
Ответы (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 для получения плоского списка свойств и развернутый em> значения записи, которое дает объект, тип которого зависит от значения конфигурации.
Вы можете попробовать мою оболочку scala https://github.com/andr83/scalaconfig. С его помощью преобразовать объект конфигурации в свойства Java просто:
val properties = config.as[Properties]
Поскольку typesafe config
/hocon
поддерживает гораздо более богатую структуру, чем java.util.propeties
, будет сложно получить безопасное преобразование.
Или говоря иначе, поскольку properties
может выражать только подмножество hocon
, преобразование не ясно, так как оно может привести к потере информации.
Итак, если ваша конфигурация довольно плоская и не содержит utf-8
, вы можете преобразовать hocon
в json
, а затем извлечь значения.
Лучшим решением было бы реализовать ConfigClass
и заполнить значения значениями из hocon и передать их классу, который вы хотите настроить.
Это невозможно напрямую через конфигурацию 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}
- без запятой между значениями. Я считаю, что это верно для всех конкатенаций и замещений массивов.