Как я должен обрабатывать проверенные и непроверенные исключения в Java Config @Bean методе, чтобы отобразить удобную для пользователя причину ошибки?[дубликат]
-
20-12-2019 - |
Вопрос
Я разрабатываю небольшое приложение командной строки на основе spring-boot.В основном классе есть поле с аннотацией @Autowired @Autowired Repository repository;
рецепт построения которого предоставлен в классе Java Config, который имеет соответствующий метод с аннотацией @Bean @Bean Repository repository(){...}
.
Метод с аннотацией @Bean содержит код, который может генерировать проверенные и непроверенные исключения.@Bean Repository repository(){...//exceptions}
Моя цель - создать удобное для пользователя приложение, которое регистрирует короткие сообщения на соответствующем уровне протоколирования, а не длинные трассировки стека.
В настоящее время исключение в Java Config @Bean-annotated методе приводит к завершению работы приложения с o.s.boot.SpringApplication: Application startup failed
сообщение и очень длинная трассировка стека.
Интересно, есть ли хороший способ обрабатывать хотя бы типичные исключения (о которых я знаю) в Java Config @Bean-аннотированный метод для регистрации удобных для пользователя кратких сообщений, полезных для устранения неполадок.
Я предполагаю, что такая стратегия предполагала бы добавление кода обработки исключений в класс Java Config, но я никогда не видел такого кода в общедоступных классах Java Config, что предполагает, что код обработки исключений в классах Java Config может быть плохой практикой.
Спасибо.
Решение
Я думаю, что здесь у вас есть несколько вариантов, и какой из них является лучшим, во многом зависит от личных предпочтений и структуры вашего приложения.
Одним из вариантов было бы выполнить всю проверку входных данных перед вызовом SpringApplication.run()
.Это сработало бы для любых аргументов командной строки, но в лучшем случае было бы громоздким для всего, что настроено через application.properties
.
Вместо того, чтобы выбрасывать исключения из вашего @Bean
методы, вы могли бы отлавливать их и обращаться с ними соответствующим образом.Если проблема незначительна, вы можете записать информацию или предупреждающее сообщение, объясняющее проблему, и разрешить приложению продолжить работу.Если проблема носит катастрофический характер, вы можете записать в журнал сообщение об ошибке, а затем вызвать System.exit()
.Хотя это обеспечит удобное для пользователя сообщение об ошибках для любых исключений, возникших во время вашего @Bean
методы вызываются, у вас все равно останутся трассировки стека для любых исключений, которые возникнут после этого.
Наконец, вы могли бы обернуть вызов следующим образом SpringApplication.run()
в блоке try-catch.Затем вы могли бы изучить перехваченное исключение и цепочку причин, чтобы определить подходящее сообщение об ошибке для регистрации.Преимущество этого подхода заключается в том, что он позволит вам предоставить удобное для пользователя сообщение об ошибке для любого исключения, которое вызывает SpringApplication.run()
потерпеть неудачу, а не просто ту, которая исходит из одного из ваших @Bean
методы.
Предполагая, что для проверки есть аргументы командной строки, я бы, вероятно, использовал комбинацию первого и третьего вариантов.Для начала я бы использовал библиотеку CLI, такую как JOpt Simple, чтобы немного упростить задачу.