2016-05-26 2 views
3

У меня довольно сложное приложение Spring Boot (включая Spring MVC и Security), которое, помимо прочего, требует настройки базы данных (url, username и password). Требование, чтобы позволить конечному пользователю настроить БД с помощью самого приложения, как следующее:Реконфигурация на лету DB в приложении Spring Boot

  1. Пользователь запускает приложение, которое не имеет конфигурацию DB пока
  2. Применение замечает отсутствие конфигурации DB и представляет пользователь с экраном конфигурации
  3. пользователь вводит URL и учетные данные
  4. Application начинает использовать этот DB

Очевидная проблема в том, что я не могу создать любой BEA ns, для которых требуется DataSource, для которого требуется конфигурация БД до тех пор, пока эта конфигурация не будет известна.

Есть ли способ отложить инициализацию большинства компонентов приложения до тех пор, пока не будет выполнен первый этап настройки?

- Обновление - Некоторые из компонентов приложения инициализируют свое состояние из БД в своих методах @PostConsutrct. Поэтому мне нужно либо задержать их создание, либо использовать способ обновления (потенциально) всех компонентов в контексте приложения после предоставления конфигурации.

+0

Это кажется очень интересным ... вы видели [Spring-Bean Post Processors] (http://www.tutorialspoint.com/spring/spring_bean_post_processors.htm) – KLajdPaja

+0

Да, у меня есть. Но не могу понять, как их можно использовать здесь. – Nikem

+0

Не уверен, что это сработает или нет, но вы можете реализовать свою собственную версию DataSource, которая в основном представляет собой реализацию Dummy при запуске. Затем после ввода правильных учетных данных базы данных попытайтесь и измените DataSource в ApplicationContext. – hooknc

ответ

1

Я предлагаю вы могли бы подумать о наличии другого модуля/программы или простой скрипт, который будет просить, чтобы предоставить все детали, такие как базы данных и т.д., хранить эту информацию в файл application.properties (может быть полезно реорганизованную конфигурацию Spring boot external configuration), а затем запустите основную программу с уже имеющейся информацией о источнике данных. Это может быть немного проще.

0

Как вы, вероятно, ожидали, вам понадобится экземпляр javax.sql.DataSource в момент создания контекста Spring Spring.

Я предлагаю вам подкласс Spring org.springframework.jdbc.datasource.DelegatingDataSource и переопределить afterPropertiesSet пустым методом (реализация по умолчанию вызывает ошибку, если вы не предоставили источник данных). Когда пользователь поставляет данные, которые вам нужны, чтобы выбрать db, вы можете вставить последний источник данных позднее в DelegatingDataSource.

Источник: https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DelegatingDataSource.java

+0

Я добавил несколько объяснений, почему я несколько скептически отношусь. Но я попробую. – Nikem

+1

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