Как получить все параметры конфигурации из файла .scala? - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу вызвать все параметры из BeamConfig.scala в другом классе scala.Параметры, хранящиеся в BeamConfig.scala, выглядят следующим образом:

case class WarmStart(
  enabled: scala.Boolean,
  path: java.lang.String
)

object WarmStart {

  def apply(c: com.typesafe.config.Config): BeamConfig.Beam.WarmStart = {
    BeamConfig.Beam.WarmStart(
      enabled = c.hasPathOrNull("enabled") && c.getBoolean("enabled"),
      path = if (c.hasPathOrNull("path")) c.getString("path") else "output"
    )
  }
}

Итак, в BeamConfig.scala имеется более 100 объектов параметров, таких как объект выше.Если я хочу получить параметр из этого файла, то я сделаю так:

beam.warmStart.enable
beam.warmStart.path

Где луч - это корневой класс. Так есть ли способ, чтобы я мог вызвать все параметры в массе илиЯ могу хранить все объекты в какой-то карте или что-то еще.Спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Во-первых, я бы отделил код, который читает конфигурацию, от кода, который обрабатывает результаты.В этом случае значение по умолчанию "output" встраивается в код, который читает конфигурацию, когда это, вероятно, должно быть выполнено в отдельном проходе.

Во-вторых, я бы использовал пакет для автоматического заполнения case class иззапись конфигурации.Затем вам потребуется одна строка для каждого объекта конфигурации, и вы получите результаты, проверенные для вас.Например,

object BeamConfig {
  val warmStart = Config[WarmStart]("warmStart")
  val config2 = Config[Config2]("config2")
  ...
}

Если вам нужна некоторая обработка, вы можете сделать это

val warmStart = ProcessWarmStart(Config[WarmStart]("warmStart"))

Этот подход все еще требует небольшого количества кода котельной пластины, но он обеспечивает лучшую безопасность типов, чем массовый импортКонфигурация.

Я бы также рассмотрел возможность объединения объектов в меньшее количество вложенных объектов с соответствующими вложенными классами.


Вот урезанная версия Config с использованием json4s и jackson:

import com.typesafe.config._
import org.json4s._
import org.json4s.jackson.JsonMethods._

object Config {
  private val cfgFile = "configFile"
  private val conf = ConfigFactory.load(cfgFile).withFallback(ConfigFactory.load())
  private val jData = parse(conf.root.render(ConfigRenderOptions.concise))

  def apply[T](name: String)(implicit formats: Formats = DefaultFormats, mf: Manifest[T]): T =
    Extraction.extract(jData \\ name)(formats, mf)
}

Это вызовет исключение, если конкретный объект конфигурации не существует или не соответствует формату класса T.

0 голосов
/ 20 ноября 2018

есть несколько разных способов сделать это:

Использование Typesafe Config в несколько небезопасной манере: https://github.com/lightbend/config#api-example

Это даст вам доступ, подобный карте, но можеточень легко взорваться, если имена неправильные, типы не выстраиваются в линию и т. д.

Использование PureConfig (обертка вокруг типизированной конфигурации, которая позволяет автоматически выводить конфигурационные декодеры на основе класса case, вроде circe для json) https://pureconfig.github.io/docs/

Таким образом, вам придется один раз написать большой класс case-класса со 100 полями, но у вас есть безопасное декодирование config в этот класс case, и после этого у вас будут обычные именованные свойства с их правильными типами.

(Обратите внимание, что при переименовании рефактора это не изменится)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...