Объект карты конфигурации Play (Scala)

Я хотел бы получить доступ к следующей конфигурации

customers {
  "cust1" {
    clientId: "id1"
    attrs {
      att1: "str1"
      att2: "str2"
      att3: "str3"
      att4: "str4"
    }
  }
  "cust2" {
    clientId: "id2"
    attrs: {
      att1: "faldfjalfj"
      att2: "reqwrewrqrq"
    }
  }
  "cust3" {
    clientId: "id3"
    attrs {
      att2: "xvcbzxbv"
    }
  }
}

как Map[String, CustomerConfig], где CustomerConfig

package models

import play.api.ConfigLoader
import com.typesafe.config.Config // I added this import in order to make the documentation snippet compile to the best of my knowledge.

case class CustomerConfig(clientId: String, attrs: Map[String, String])

object CustomerConfig {
  implicit val configLoader: ConfigLoader[CustomerConfig] = new ConfigLoader[CustomerConfig] {
  def load(rootConfig: Config, path: String): CustomerConfig = {
    val config = rootConfig.getConfig(path)
    CustomerConfig(
      clientId = config.getString("clientId"),
      attrs = config.get[Map[String, String]]("attrs").map { case (attr, attrVal) =>
        (attr, attrVal)
      })
    }
  }
}

Для справки, вот как я сейчас пытаюсь сослаться на него:

  val resellerEnvMap = conf.get[Map[String, CustomerConfig]]("customers").map {
    case (customer, customerConfig) =>
      customer -> customerConfig.attrs.map {
        case (attr, attrVal) =>
          attr -> new Obj(attrVal, customerConfig.clientId)
      }
  }

на основе документации по пользовательскому загрузчику конфигурации.

Проблема в том, что config.get[A] не существует (как и config.getMap[K, V]) в соответствии с тем, что я считаю Документация по API. Я хотел бы заполнить этот map из файла конфигурации. Моя конечная цель — заполнить все, что находится в функциональной близости от Map[String, Map[String, (String, String)]], где первое String — это имя клиента, 2-е — имя атрибута, 3-е — значение атрибута и, наконец, 4-е — идентификатор клиента.


person juanchito    schedule 12.07.2018    source источник


Ответы (1)


Play 2.6 использует com.typesafe:config 1.3.2, а ссылка, которую вы разместили, похоже, из версии 2? Вот один из способов сделать это:

object CustomerConfig {
  implicit val configLoader: ConfigLoader[CustomerConfig] = new ConfigLoader[CustomerConfig] {
    def load(rootConfig: Config, path: String): CustomerConfig = {
      val config = rootConfig.getConfig(path)
      import scala.collection.JavaConverters._

      val attrConfig = config.getConfig("attrs")
      CustomerConfig(
        clientId = config.getString("clientId"),
        attrs = attrConfig.entrySet().asScala.map { entry =>
          (entry.getKey, attrConfig.getString(entry.getKey))
        }.toMap
      )
    }
  }
}
person Jamie    schedule 19.07.2018
comment
спасибо, @Jaime! Не могли бы вы взглянуть на stackoverflow.com/questions/51449346/ и позвольте мне, если это возможно? - person juanchito; 20.07.2018
comment
@juanchito ответ на ваш другой вопрос :) - person stsatlantis; 21.07.2018