【问题标题】:Converting Typesafe Config type to java.util.Properties将 Typesafe Config 类型转换为 java.util.Properties
【发布时间】:2016-03-24 02:38:16
【问题描述】:

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

【问题讨论】:

    标签: java scala typesafe


    【解决方案1】:

    由于typesafe config/hocon 支持的结构比java.util.propeties 丰富得多,因此很难进行安全转换。

    或者说因为properties只能表达hocon的一个子集,转换不清楚,可能会有信息丢失。

    因此,如果您的配置相当平坦且不包含utf-8,那么您可以将hocon 转换为json,然后提取值。

    更好的解决方案是实现 ConfigClass 并使用来自 hocon 的值填充值并将其传递给您要配置的类。

    【讨论】:

    • 是的,我知道这个数据模型不匹配。我希望 Config 或 ConfigObject 可能有一种“扁平化”方法。实际上,我想从我的配置对象中配置一个 Kafka 消费者,而 Kafka 消费者将一个属性作为参数;所以我或多或少肯定我的配置部分不会被嵌套。
    【解决方案2】:

    这是一种将类型安全的Config 对象转换为Properties 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"
      }
    }
    

    您可以像这样创建相应的 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得到一个扁平化的属性列表,条目值的展开,它给出了一个对象,其类型取决于配置值。

    【讨论】:

      【解决方案3】:

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

      val properties = config.as[Properties]
      

      【讨论】:

      • 这应该是配置恕我直言的一部分
      【解决方案4】:

      不可能直接通过类型安全配置。即使将整个 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 的问题

      示例 hocon:

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

      类型安全配置会将其解析为

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

      但是,如果您尝试在 hocon 中解析它 - 它会引发语法错误。 , 不能在那里。 hocon 正确解析将是 9000${?HTTP_PORT} - 值之间没有逗号。我相信这对于所有数组连接和替换都是正确的

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 1970-01-01
        • 2018-09-29
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2014-02-20
        相关资源
        最近更新 更多