Springバージョン3.0.2を使用しています。@Transactional
アノテーションでトランザクションを管理したい。
このapplicationContext.xml
ファイルには、次のデータソース構成があります。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="oracle.jdbc.OracleDriver"
p:url="jdbc:oracle:thin:@localhost:1521:xe"
p:username="userName"
p:password="password"/>
は次のSessionFactory
ように構成されています。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>hibernate.cfg.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.OracleDialect
</value>
</property>
</bean>
このhibernate.cfg.xml
ファイルはデフォルトのパッケージにあります。
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="CountryService"
class="dao.CountryDAO"
p:sessionFactory-ref="sessionFactory" />
CountryService
インターフェースは以下の通りです。
package daoservice;
import java.util.List;
import model.Country;
public interface CountryService
{
public List<Country>getAllCountries();
}
以下はその実装です- CountryDAO
。
package dao;
import daoservice.CountryService;
import java.util.List;
import model.Country;
import org.hibernate.SessionFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional(readOnly = true)
final public class CountryDAO implements CountryService
{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
System.out.println("template = "+this.sessionFactory);
}
@SuppressWarnings("unchecked")
public List<Country>getAllCountries() throws DataAccessException
{
System.out.println("sessionFactory = "+sessionFactory);
return sessionFactory.getCurrentSession().createQuery("from model.Country order by countryId desc").list();
}
}
展開時に、次のステートメントは、
System.out.println("template = "+this.sessionFactory);
setSessionFactory()
メソッドのように次のようなものを表示します
template = org.hibernate.impl.SessionFactoryImpl@c63558
applicationContext.xml
これは、ファイルで行われた上記の構成が機能しているように見えることを意味します。
getAllCountries()
しかし、(GETメソッドの間に)私のSpringコントローラークラスから前のクラスのようにメソッドを呼び出す
CountryDAO c=new CountryDAO();
List<Country> countryList = c.getAllCountries();
NullPointerException
がスローされ、ステートメントが発生します
System.out.println("sessionFactory = "+sessionFactory);
ディスプレイ
sessionFactory = null
明らかなように。
おそらく、のコンストラクターによって新しいインスタンスが作成され、その中でCountryDAO
オブジェクトsessionFactory
が。になるようnull
です。
CountryDAO
では、Spring(または他の場所)からDAOを使用するにはどうすればよいですか?
答えに従って試してみたところ、次の例外が発生しました。
org.springframework.beans.factory.BeanCreationException:「countryController」という名前のBeanの作成中にエラーが発生しました:自動配線された依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドを自動配線できませんでした:private dao.CountryDAO controller.CountryController.countryDAO; ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:依存関係に一致するタイプ[dao.CountryDAO]のBeanが見つかりません:この依存関係のautowire候補として適格な少なくとも1つのBeanが必要です。依存関係のアノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}