Правильный способ обработки ошибки при загрузке ConfigFactory

У меня есть приложение, выбирающее, какой файл конфигурации я хочу загрузить:

-Dconfig.file=src/main/resources/dev.conf

Я создал трейт Settings, чтобы легко расширять Settings и иметь доступ к этим переменным в моем приложении. В реализации я использую ConfigFactory следующим образом:

val config = ConfigFactory.load()

Это проблема. Если этот аргумент, определяющий 'dev.conf', отсутствует, тогда среди прочих будет искаться 'application.conf', и переменные в 'dev.conf' не будут установлены. Позже приложение взрывается, когда пытается получить что-то не в conf.

Как я могу тут же взорваться, если я знаю, что файл конфигурации не был установлен? Это значение «conf» не равно null/None, и у меня нет прямого доступа к этому аргументу «dev.conf», который мог быть передан.


person akkaStreamsHurts    schedule 22.03.2017    source источник


Ответы (1)


Вместо использования ConfigFactory.load() вы можете использовать

ConfigFactory.parseFile(new File(pathToYourConfig))

Это гарантирует, что файл из ваших опций -Dconfig используется и может анализироваться.

Чтобы убедиться, что файл конфигурации содержит все необходимые поля, вам необходимо пройти проверку работоспособности. Мне нравится создавать экземпляр класса, который назначит все поля конфигурации, которые мне нужны, для val, например

class Settings(conf: Config) {
      val projectName = conf.getString("projectName")
      val database = conf.getString("database")
}

Теперь при загрузке приложения этот класс выдаст исключение, если поле отсутствует в файле конфигурации, указанном в -Dconfig.file.

person soote    schedule 22.03.2017
comment
Эта первая часть противоречит цели наличия -Dconfig, так как теперь мне нужно менять код (меняя значение pathToYourConfig) каждый раз, когда я хочу переключиться с моего dev.conf на staging.conf на prod.conf. - person akkaStreamsHurts; 23.03.2017
comment
Я согласен с этой проверкой здравомыслия - к сожалению, это может быть единственный способ - person akkaStreamsHurts; 23.03.2017
comment
В первой части вы должны получить pathToYourConfig из аргументов cli, а не жестко кодировать их. - person soote; 23.03.2017