2014-12-13 3 views
-1

Я пытаюсь понять, как на жизненном цикле приложения Spring Boot условно сохраняться в одном объекте при запуске приложения. Обычный способ загрузки исходных данных через «import.sql» или аналогичные методы не подходит в этом случае, поскольку вставка является условной. При запуске я бы хотел, чтобы мое приложение проверяло, есть ли учетная запись администратора и связанная с ней роль администратора. Если они не существуют, я хотел бы, чтобы приложение создало их. Если они существуют, я хочу, чтобы приложение ничего не делало и оставило существующие сущности в одиночку. Если я использую метод import.sql, я либо завершаю дубликат ключа (имя пользователя = admin), либо я перезапишу существующую учетную запись администратора, которая, возможно, изменила ее пароль от пароля по умолчанию предыдущей установкой приложения.spring-boot-jpa Первичная сущность сущности

Я пробовал использовать ApplicationListeners для всех событий Spring и Spring Boot по умолчанию, и я получаю исключения исключений для каждого из этих слушателей, потому что репозитории JPA еще не инициализированы. Я думал, что слушатели, вызываемые для ContextRefreshedEvent, должны были быть вызваны после того, как все бобы будут инициализированы, но я думаю, что я ошибаюсь. Я также попытался создать компонент, который имеет аннотированный метод @PostConstruct, который создает это сущность, однако у меня был тот же результат, когда JPA CrudRepositories не инициализировалась.

Итак, мой базовый вопрос; «Какая предпочтительная точка входа для выполнения инициализации работы с JPA CrudRepositories во время запуска приложения Spring Boot?»

ответ

0

ContextRefreshedEvent обычно работает (так что у вас может быть проблема с порядком инициализации с вашим слушателем). Вы также можете использовать SmartInitializingSingleton или SmartLifecycle с autostart = true. В приложении Spring Boot у вас также есть CommandLineRunner.

+0

Спасибо за указание, что _ContextRefreshedEvent_ ** должен работать **. Это заставило меня взглянуть на вещи немного глубже. Проблема не была конкретно связана с JPA. Все, что было '@ Autowired',' @ Inject'ed или '@ Value'd в реализации _ApplicationListener_, было нулевым, когда реализация фактически выполнялась. Я обошел это, не используя autowiring, и вытащил то, что мне нужно, из _ApplicationContext_, переданного с _Event_. Кажется, это трюк. – user2856925

+0

Да, это сработает. У Spring нет выбора, кроме как создать экземпляр 'ApplicationListeners' раньше (потому что есть события, которые предшествуют тому, что вам интересно). Таким образом, это объясняет недостающие зависимости. –

Смежные вопросы