我是Spring Hibernate的新手,所以我遇到的问题是由一个在静态块中初始化的函数引起的。
这是我的DAO课程:
private static HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
hibernateTemplate = new HibernateTemplate(sessionFactory);
}
static{
loadAllProvince();
}
public static void loadAllProvince () {
List regionList = hibernateTemplate.find("FROM regions");
if (regionList.size() > 0 ) {
for (int i=0; i<regionList.size(); i++) {
Object[] obj = (Object[]) regionList.get(i) ;
mapRegion.put(obj[1].toString(), obj[0].toString());
}
}
}
这是我的applicationContext.xml中的bean配置:
<bean id="regionDAOBean" class="com.dao.RegionDAO">
<property name="sessionFactory" ref="sessionFactoryBean"/>
</bean>
当我运行我的应用程序时,例外说:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'regionDAOBean' defined in class path resource [applicationContext.xml]:
Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
在我初始化静态块中的函数之前,它一直工作,所以我应该怎么做才能在静态块中初始化函数?
答案 0 :(得分:2)
我只是使用@PostConstruct
(并摆脱init
方法):
@PostConstruct
public void loadAllProvince () {
...
}
JSR-250 @PostConstruct和@PreDestroy注释通常是 被认为是接受现代生命周期回调的最佳实践 Spring应用程序。使用这些注释意味着你的bean是 没有耦合到Spring特定的接口。有关详情,请参阅章节 5.9.6,“@ PostConstruct和@PreDestroy”。
如果您不想使用JSR-250注释但仍然存在 希望删除耦合考虑使用init-method和 destroy-method对象定义元数据。
http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html
问题是在Spring有机会完成bean初始化之前调用静态块(正如@sodik指出的那样)。这是@PostConstruct
派上用场的时候,因为它告诉Spring在bean完全初始化后调用这个方法。
答案 1 :(得分:0)
导致问题(如jax所示)静态方法loadAllProvince()
在注入sessionFactory之前执行。但是我宁愿使loadAllProvince()
非静态并在填充bean属性后调用它,例如
<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="loadAllProvince">
<property name="sessionFactory" ref="sessionFactoryBean"/>
</bean>
有关详细信息,请参阅http://www.mkyong.com/spring/spring-init-method-and-destroy-method-example/。
答案 2 :(得分:0)
我认为你真正想要的是使用init-method:
<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="init">
<property name="sessionFactory" ref="sessionFactoryBean"/>
</bean>
private HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void init() throws Exception {
loadAllProvince();
}
public void loadAllProvince () {
List regionList = hibernateTemplate.find("FROM regions");
if (regionList.size() > 0 ) {
for (int i=0; i<regionList.size(); i++) {
Object[] obj = (Object[]) regionList.get(i) ;
mapRegion.put(obj[1].toString(), obj[0].toString());
}
}
}