2015-12-17 33 views

回答

1

由於typesafe config/hocon支持比java.util.propeties更豐富的結構,因此很難獲得安全的轉換。

或以其他方式發言,因爲properties只能表示hocon的子集,轉換不明確,因爲它會有可能的信息丟失。

因此,如果您的配置相當平坦,並且不包含utf-8,那麼您可以將hocon轉換爲json,然後提取這些值。

更好的解決方案是實現一個ConfigClass並使用來自hocon的值填充值並將其傳遞給想要配置的類。

+2

是的,我知道這個數據模型不匹配。我希望Config或ConfigObject可能有一種「扁平化」的方法。實際上,我想從我的配置對象中配置一個Kafka使用者,並且Kafka使用者將一個Properties作爲參數;所以我或多或少地確定我的配置到消費者的部分不會被嵌套。 –

5

這裏是一種將類型安全對象轉換爲對象的方法 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" 
    } 
} 

您可以創建相應的屬性對象那樣:

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 to g et flatten list of properties,並且展開的條目值爲,這給出了一個Object取決於配置值的類型。

3

你可以試試我的Scala包裝https://github.com/andr83/scalaconfig。使用它將配置對象轉換爲java屬性很簡單:

val properties = config.as[Properties] 
+2

這應該是Config imho的一部分 –