2014-09-19 4 views
0

У меня есть многомодульное приложение на основе весны. И в моем модуле DAO DB (встроенное дерби) запускается и создается классом, реализует ApplicationListener.Весна: запустите код до того, как загружен контекст сохранения

Проблема в том, что в журналах огромная стоп-трасса из Spring, в которой говорится, что нет db (невозможно получить соединение).

Тем не менее, мое приложение работает без проблем. Эта команда stacktrace появилась до вызова ApplicationListener и создания db. На самом деле, я вижу это только тогда, когда я запускаю приложение в первый раз на машине, потому что db создан только на этот раз, чем он просто использовался.

Итак, мой вопрос - это избегать этого исключения в журналах? Может быть, есть установка spring или hibenate, не подключаемая к db до полной загрузки приложения? Или вызвать код, создающий db другим слушателем?

+0

И ... почему вы не загружаете базу данных из контекста приложения? –

+0

Как? Он не существует до того, как контекст приложения вызывает обновление ... Я не знаю, как вызвать любой Java-код до создания контекста приложения. – serg

ответ

0

Ну вот как я это делаю: контекст ROOT содержит источник данных, dao, службу и диспетчер транзакций. В XML-конфигурации, декларация базы данных является:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:url="jdbc:derby:/path/to/database;create=TRUE" 
     p:username="user" p:password="pwd" 
     p:driverClassName="org.apache.derby.jdbc.EmbeddedDriver"/> 

он может быть использован для объявления сеанса завода для спящего режима и связанный с DAO, как:

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     id="sessionFactory" p:dataSource-ref="datasource"> 
    <!-- hibernate config --> 
    ... 
</bean> 
<bean class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     name="transactionManager" p:sessionFactory-ref="sessionFactory"/> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="myDao" class="... .myDaoImpl" p:sessionFactory-ref="sessionFactory" .../> 

Таким образом, все созданный весной , что гарантирует правильность порядка создания. Конечно, то же самое можно и в конфигурации Java с той же логикой.

+0

Спасибо! Ваша идея предоставить Spring возможности для создания БД решить мою проблему. Теперь нет исключений, и это дает мне возможность использовать Spring JdbcTemplates в то время, когда я инициализирую БД. – serg

0

Я предполагаю, что вы извлекаете некоторые данные из базы данных из внутренних созданных весенних бобов. Возможно, через @PostConstruct или другим способом. Помните, что до полной загрузки весеннего контекста некоторые бобы могут вводить неинициализированные бобы.

Так что не используйте БД, не вызывайте никаких DAO до, вы уверены, что весенний контекст полностью инициализирован.

Чтобы сделать такие начальные вызовы к DAO, попробовать такой скороговоркой, что гарантирует контекстную весна Комплектность:

@Component 
public class SpringContextMonitor implements ApplicationListener<ApplicationEvent> { 

    @Autowired 
    private SomeDao dao; 

    ... 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      onStart((ContextRefreshedEvent) event); 
     } 
    } 

    private void onStart(ContextRefreshedEvent event) { 

    // do your initialization here 
    dao.getSomething(); 
    dao2.getSomething(); 
    ... 

    } 

    ... 
} 

OnStart метод в приведенном выше примере это место, где вы уверены, что все бобы полностью инициализирован

+0

Спасибо за вашу помощь. Я думаю, что ваша работа действительно хороша, вероятно, слегка меняет дизайн, как предложил Serge Ballesta, потому что нет необходимости в каких-либо обходных решениях. – serg

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