Как мне поймать io.dropwizard.configuration.ConfigurationParsingException, чтобы я мог правильно его зарегистрировать?

Каким-то образом он обходит все блоки catch

public class App extends Application<AppConfig> {
  private static final Logger LOG = LoggerFactory.getLogger(App.class);


  @Override
  public void run(final AppConfig config, final Environment environment) {
    try {
      environment.jersey().register(new StatusResource());
      LOG.info("start-up");
    } catch (final Exception e) {
      LOG.error("start-up failed: {}", e.getMessage(), e);
    }
  }

  public static void main(String[] args) throws Exception {
    try {
      new App().run(args);
    } catch (final Exception e) {
      LOG.error("failed to create foo: {}", e.getMessage(), e);
    }
  }
}
1
Jay 7 Ноя 2019 в 03:52
Публикация трассировки стека может помочь.
 – 
Slaw
7 Ноя 2019 в 06:30
Нет трассировки стека, вот в чем проблема
 – 
Jay
7 Ноя 2019 в 08:48
Что если запустить через отладчик?
 – 
Slaw
7 Ноя 2019 в 09:13

2 ответа

Глядя на документацию DropWizard, ни один из вызываемых вами методов не вызывает никаких исключений. Рискну сказать, что один из вызываемых вами методов обрабатывает генерируемую ошибку, поэтому она не распространяется вверх на ваши блоки catch. Надеюсь это поможет.

0
Nick Clark 7 Ноя 2019 в 04:29

Добавлено после комментария: Где ловятся исключения?

at io.dropwizard.cli.Cli.run(Cli.java:78) дает нам ответ.

Что можно было сделать для достижения цели:

Из примечаний к выпуску которые долго читают, есть этот PR №2260. Похоже, это связано с заявленной проблемой: ведение журнала в формате JSON на этапе начальной загрузки до применения конфигурации.

Это может быть полезно или нет, в зависимости от того, как журналы dropwizard настроены и транспортируются в стек ELK. Если используется локальный файл журнала, то StdErr и StdOut должны быть перенаправлены в этот файл. Тогда LogStash сможет с ними справиться. Используется ли какой-то прямой сетевой транспорт - не знаю.

Второе изменение: Также существует check команда. Он используется для проверки параметров конфигурации. Таким образом, он может быть интегрирован где-нибудь в цепочке инструментов развертывания для проверки конфигурации, подлежащей развертыванию.

~/source/dropwizard-static$  java -jar target/dropwizard-static-1.0-SNAPSHOT.jar check config1.yml
config1.yml has an error:
  * Unrecognized field at: loging
    Did you mean?:
      - logging
      - assets
      - server
      - metrics
      - httpClient
        [1 more]

~/source/dropwizard-static$  java -jar target/dropwizard-static-1.0-SNAPSHOT.jar
usage: java -jar dropwizard-static-1.0-SNAPSHOT.jar
       [-h] [-v] {server,check} ...

positional arguments:
  {server,check}         available commands

named arguments:
  -h, --help             show this help message and exit
  -v, --version          show the application version and exit

Исходный ответ следующий:

У меня есть игрушечный dropwizard проект, здесь. Когда я пытаюсь запустить его со сломанной конфигурацией:

#logging:
loging:
  level: INFO
#  level: DEBUG
  loggers:
    com.gitlab.zloster: DEBUG

Получаю следующее:

~/source/dropwizard-static$  java -jar target/dropwizard-static-1.0-SNAPSHOT.jar server config1.yml
io.dropwizard.configuration.ConfigurationParsingException: config1.yml has an error:
  * Unrecognized field at: loging
Did you mean?:
  - logging
  - assets
  - server
  - metrics
  - httpClient
    [1 more]

at io.dropwizard.configuration.ConfigurationParsingException$Builder.build(ConfigurationParsingException.java:279)
at io.dropwizard.configuration.BaseConfigurationFactory.build(BaseConfigurationFactory.java:140)
at io.dropwizard.configuration.BaseConfigurationFactory.build(BaseConfigurationFactory.java:89)
at io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:126)
at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:74)
at io.dropwizard.cli.Cli.run(Cli.java:78)
at io.dropwizard.Application.run(Application.java:93)
at com.gitlab.zloster.ServeStaticApplication.main(ServeStaticApplication.java:21)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "loging" (class com.gitlab.zloster.ServeStaticApplicationConfiguration), not marked as ignorable (6 known properties: "assets", "viewRendererConfiguration", "logging", "httpClient", "server", "metrics"])
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.gitlab.zloster.ServeStaticApplicationConfiguration["loging"])
 at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:60)
 at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:822)     
 at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1152)
 at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1589)
 at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1567)
 at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:258)
 at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:155)
 at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3984)
 at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2276)
 at io.dropwizard.configuration.BaseConfigurationFactory.build(BaseConfigurationFactory.java:127)
 ... 6 more

Мне кажется, что исключение регистрируется правильно *. * Это, конечно, зависит от определения «правильно зарегистрирован».

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

0
zloster 8 Ноя 2019 в 17:22
Журналы должны быть правильно отформатированы в формате JSON и отправлены в наш стек ELK, чтобы мы могли просматривать их в Kibana. В противном случае они просто будут сидеть на инстансе EC2 где-то в облаке, и никто не сможет их увидеть или даже знать, что они существуют. Для каждого исключения мне нужно вызывать LOG.error("Exception", e);, чтобы все это произошло.
 – 
Jay
7 Ноя 2019 в 17:57
Пожалуйста, отредактируйте свой вопрос, чтобы отразить эти важные детали. Я обновлю ответ.
 – 
zloster
7 Ноя 2019 в 21:01