0

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)}

4

1 に答える 1

1

CountryDAOから Beanを取得するWebApplicationContextか、xml または注釈によってコントローラーに注入する必要があります。このようなもの:

@Controller
public class SomeController{

    @Autowired
    private CountryService CountryService;

    // Getters and Setters

}

あなたがしているのCountryDAO c=new CountryDAO();は、Spring コンテナーによって管理されていない新しいオブジェクトをインスタンス化することだけなので、もちろん、セッション ファクトリは に設定されnullます。

于 2012-12-11T05:07:01.233 に答える