0

定型コードを減らすのに役立つジェネリック クラスを作成しようとしています。これには Spring 3 (MVC) と Hibernate 4 を使用しています。

クラスは次のようになります。

@Repository("AutoComplete")
public class AutoComplete<T extends Serializable> implements IAutoComplete {

    @Autowired
    private SessionFactory sessionFactory;

    private Class<T> entity;

    public AutoComplete(Class<T> entity) {
        this.setEntity(entity);
    }

    @Transactional(readOnly=true)
    public List<String> getAllFTS(String searchTerm) {
        Session session = sessionFactory.getCurrentSession();
        return null;
    }

    public Class<T> getEntity() {
        return entity;
    }

    public void setEntity(Class<T> entity) {
        this.entity = entity;
    }

}

私はこのようにBeanをインスタンス化しています:

IAutoComplete place = new AutoComplete<Place>(Place.class);
place.getAllFTS("something");

コードを実行すると、「デフォルトのコンストラクターが見つかりません」という例外が発生します。デフォルトのコンストラクターを追加すると、次の行で null ポインター例外が発生します。

Session session = sessionFactory.getCurrentSession();

これはなぜですか、どうすればこの問題を解決できますか? 問題は、Bean が Spring 自体によってインスタンス化されていないため、フィールドを自動配線できないためだと推測しています。自分で Bean をインスタンス化したいのですが、可能であれば、Spring で管理します。

4

3 に答える 3

1

<context:component-scan base-package='package name'>xml Bean 定義ファイルに追加したことを確認してください。

@Repository はステレオタイプであるため、Spring コンテナーはクラスパスのスキャンを実行し、その Bean 定義を追加して依存関係を注入します。

後で、Bean 名 (AutoComplete) を使用して ApplicationContext から Bean のハンドルを取得できます。

于 2013-03-13T11:27:00.500 に答える
0

Spring コンテナーがこの Bean をインスタンス化します。その場合、sessionFactory が注入されます。独自のコードでこの Bean をインスタンス化します: new AutoComplete()。もちろん、sessionFactory は null です。

于 2012-12-17T12:36:27.990 に答える
0

@Autowired アノテーションを持つフィールドでクラスをインスタンス化しないでください。そのフィールドを実行すると、null になります。あなたがすべきことは、Spring の ApplicationContext への参照を取得し (ApplicationContextAware インターフェースを実装することでこれを行うことができます)、AutoComplete クラスのデフォルト コンストラクターで次のコードを使用することです。

public AutoComplete() {
    sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
}

Spring を使用する際の主要なプラクティスの 1 つは、オブジェクトのインスタンス化を自分で排除することです。必要なときに Spring がオブジェクトをインスタンス化するように、Spring 構成ですべてを指定する必要があります。ただし、ジェネリックアプローチを使用する場合は、必要があります。

于 2012-12-17T12:38:37.560 に答える