0

私は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

静的ブロックで関数を初期化するまでは find が機能していたので、静的ブロックで関数を初期化するにはどうすればよいですか?

4

3 に答える 3

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、Bean が完全に初期化されたらこのメソッドを呼び出すように Spring に指示するため、便利です。

于 2013-09-18T11:19:43.847 に答える
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());                  
       }                        
    }   
 }
于 2013-09-18T11:12:45.340 に答える
0

loadAllProvince()sessionFactory が注入される前に静的メソッドが実行されるという問題が (jax が示唆するように) 発生します。ただし、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/を参照してください。

于 2013-09-18T11:11:12.147 に答える