2016-10-10 2 views
0

Я работаю над приложением на основе весны и сервлетов. Мое требование - загрузить данные из базы данных и сохранить в ehcache. Я написал прослушиватель, который вызывается после запуска сервера jboss. Но проблема заключается в моем приложении, мы используем весенние спящие классы для подключения к базе данных и загрузки данных из БД. Согласно требованию данные должны быть получены из базы данных и хранить в кеш-объекте (ehcache). Но когда загружается класс слушателя, другие файлы конфигурации xml (applicationContext.xml ..) еще не загружены, где мы настраиваем данные источника данных для подключения к базе данных. Ниже мой код:загрузить значение из базы данных при запуске сервера

Класс слушателя.

import net.sf.ehcache.*; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
/imports 
public class MyInitializationListener extends HibernateDaoSupport implements ServletContextListener { 

    /** Singleton instance of CacheManager. */ 
    private static CacheManager singletonManager = null; 

    public void contextDestroyed(ServletContextEvent arg0) { 
     System.out.println("--ServletContextListener destroyed*--"); 
    } 
    private static CacheManager getInstance() { 
     if (singletonManager == null) { 
      singletonManager = CacheManager.create(); 
     } 
     return singletonManager; 
    } 

    private Cache getCache() { 
     Cache cache = null; 
     cache = MyInitializationListener.getInstance().getCache("myCache"); 
     return cache; 
    } 
    // Run this before web application is started 

    public void contextInitialized(ServletContextEvent arg0) { 
    final Cache cache = getCache(); 
     final String dbValue = getDBValue(); 
     //logic here 
     } 
public String getDBValue() throws DataLayerException{ 
    //logic to get the value from database 

} 

Ниже исключение:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/eas-webservice/ivr]] Exception sending context initialized event to listener instance of class com.data.listener.MyInitializationListener 
java.lang.NullPointerException 

ли кто-нибудь одно лицо этой ситуации before.What бы наилучшим образом подключиться к базе данных и получить значения из базы данных и хранить в кэше, когда сервер запущен. Предложения были бы полезными.

--EDITED--

Я попытался ниже способом, используя @PostConstruct к способу для вызова LoadData(), когда сервер started.But когда я проверил в заявлении для печати файла журнала не был там, который гласит, что этот метод не вызывается при запуске сервера.

@Component 
public class MyDataStore { 
    @PostConstruct 
    public void loadData() 
    { 
     System.out.println("--In @postconstruct, loadData-"); 
    } 
} 

ответ

0

Не использовать сервлет материал, просто делать то, что вы хотите в бобе с методом аннотированный @PostConstruct, но это не обязательно будет первым боб, который будет создан. Если вам нужно что-либо сделать до начала самой весны, вам нужно будет создать контекст приложения в основном методе вручную. Все, что вы хотите провести до начала весны, должно быть до того, как будет создан контекст приложения. Если вы хотите, чтобы некоторые компоненты были созданы перед другими, это должно быть зависимостью во всех других компонентах, что действительно раздражает, а не знает о другом способе этого.

+0

Я попытался с помощью PostConstruct, но когда я начал сервер, метод с PostConstruct не вызывается. Нужно ли мне делать какую-либо другую конфигурацию, чтобы сделать метод с аннотированной работой PostConstruct? – javaUser

+0

Нет, но убедитесь, что компонент создан. Поместите System.out.println или что-то в конструкторе, чтобы убедиться, что это так. – Snickers3192

+0

Я создал класс с аннотированным методом PostConstruct с инструкцией System.out.print, и он не вызывался при запуске сервера. – javaUser

0

Непонятно формировать ваш вопрос, почему вам нужно делать логику кэша в ServletContextListener именно так, но я могу предложить, как получить доступ к вашему applicationContext внутри него.

Вы можете расширить org.springframework.web.context.ContextLoaderListener с помощью кеширования и использовать его для загрузки контекста приложения. Также, если вам нужна логика HibernateDaoSupport, ее можно добавить с помощью композиции вместо наследования.

Так что все это может выглядеть следующим образом:

MyInitializationListener

public class MyInitializationListener extends ContextLoaderListener { 

    private static CacheManager singletonManager = null; 

    pirvate HibernateDaoSupport hibernateDaoSupport; 

    ...... 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     super.contextInitialized(event); 

     ApplicationContext applicationContext = getCurrentWebApplicationContext(); 

     hibernateDaoSupport = applicationContext.getBeansOfType(HibernateDaoSupport.class).values().iterator().next(); 

     //Do cahcing logic you need; 
    } 

    ...... 

} 

web.xml

<!-- spring framework context configuration --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>MyInitializationListener</listener-class> 
</listener>