我正在开发基于spring和servlet的应用程序。 我的要求是从数据库加载数据并存储在ehcache中。我编写了一个监听器,一旦jboss服务器启动就会被调用。但问题是在我的应用程序中,我们使用spring hibernate类连接到数据库并从DB加载数据。 根据需求,必须从数据库中检索数据并存储在缓存对象(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
之前是否有人遇到过这种情况。在启动服务器时,最好的方法是连接数据库并从数据库获取值并存储在缓存中。建议会有所帮助。
- 编辑 -
我尝试使用@PostConstruct的方法在服务器启动时调用loadData()的方法。但是当我在日志文件中检查时,print语句没有指出当服务器被调用时没有调用该方法启动。
@Component
public class MyDataStore {
@PostConstruct
public void loadData()
{
System.out.println("--In @postconstruct, loadData-");
}
}
答案 0 :(得分:0)
不要使用servlet,只需在带有注释@PostConstruct
的方法的bean中执行您想要的操作,但这不一定是创建的第一个bean。如果您需要在spring本身启动之前执行任何操作,则需要手动在main方法中创建应用程序上下文。在春天开始之前你想要发生的任何事情都需要在创建应用程序上下文之前。如果你想在其他bean之前创建一些bean,它将需要成为所有其他bean的依赖项,这真的很烦人,不知道有任何其他方法可以做到这一点。
答案 1 :(得分: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>