2

私は、春までセッションファクトリインスタンスを使用しようとしている割り当てを通じて、休止状態と春を学び始めました。私は冬眠の部分を理解しましたが、春を続けることはできません。たくさんのチュートリアルと例を試しましたが、春をうまく機能させることができません。直接インスタンス化すると動作しますが。これが私のプロジェクトの問題関連の詳細です...

applicationContext.xml(WEB-INF内)

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<context:annotation-config />
<context:component-scan
    base-package="com.nagarro.training.assignment6.dao.entity.Student" />



<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
        </value>
    </property>
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven />

<bean id="studentDAO"
    class="com.nagarro.training.assignment6.dao.impl.StudentDAOImplementation">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>


</beans>

編集:提案された変更を含める StudentDAOImplementaion.java(それが使用されているファイル)

public class StudentDAOImplementation implements StudentDAO {

    /**
     * single instance of hibernate session
     */
    @Autowired
    private SessionFactory sessionFactory;

    // HibernateUtil.getSessionFactory().openSession()

    /**
     * @param sessionFactory
     */
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    /**
     * @return the sessionFactory
     */
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    private Session getSession() {
        return this.sessionFactory.getCurrentSession();
    }
        /**
     * @return list of all the students
     */
    public List<Student> getStudentList() {

        System.out.println(this.getSession().getStatistics());

        return (List<Student>) this.getSEssion.createQuery("from Student")
                .list();
    }

}

そして、これがlibフォルダー内の私のjarファイルの断片です。 ここに画像の説明を入力してください

春がなくても正常に動作しているので、休止状態のファイルとBeanを含める必要はないと思います。その春、私は仕事に取り掛かることができません。私はWebからさまざまな実装を試しましたが、それを機能させることができません。StudentDAOImplementationの**System.out.println(sessionFactory.getStatistics());**行にnullポインタ例外が表示されるだけです。

StudentDAOを呼び出すテストクラス

public class Test {

public static void main(String[] args) {
    StudentDAOImplementation sd = new StudentDAOImplementation();

    List<Student> list = sd.getStudentList();

    for(Student s : list) {
        System.out.println(s.getName());
    }
}

}

スタックトレース

Exception in thread "main" java.lang.NullPointerException
    at StudentDAOImplementation.getStudentList(StudentDAOImplementation.java:116)
    at Test.main(Test.java:13)
4

2 に答える 2

2

sessionFactory型が実際にはであるため、変数の名前は誤解を招く恐れがありますSessionSession!= SessionFactorysessionFactory.getStatistics()SpringがそのようなDAOにセッションを自動配線する方法がないため、NPEをオンにしています。NPEの前にエラーが表示されない場合は、実際にSpringでDAOをインスタンス化していないか、Sessionタイプの依存関係を見つけることができないというエラーが発生します。HibernateベースのDAOを使用する適切な方法は、DAOにを挿入し、必要な場所でメソッドSessionFactoryを呼び出すことです。このアプローチの詳細と適切なトランザクション管理の設定については、「プレーンなHibernate3APIに基づくDAOの実装」および以下を参照してください。getCurrentSession()Session

更新:一見すると、コンポーネントスキャンのパッケージがに設定されていることがわかりcom.nagarro.training.assignment6.dao.entity.Studentます。これは、パッケージではなく、クラスとまったく同じように見えます。また、実際にコンポーネントスキャンしたいものにも近くありません。コンポーネントスキャンの目的がわからないかもしれません。これは、リファレンスガイドの「アノテーションベースのコンテナ構成」で説明されています。

更新2:「テスト」コードについて:Springをまったく使用していないので、XMLを削除して、問題を回避することをお勧めします。一方、実際にSpringを使用する場合は、次のようなXMLファイルに基づいてメインメソッドにコンテキストを作成する必要があります。

ApplicationContext context = new FileSystemXmlApplicationContext(locationOfXmlFile);

次に、Spring管理のDAOが必要な場合は、を使用してDAOを作成することはできませんnew。春は魔法ではありません。同じJVMのどこかにロードされているという理由だけで、制御を奪うことはありません。*次のように、Springに作成したDAOを要求する必要があります。

StudentDAO dao = context.getBean(StudentDAO.class);

具体的なタイプではなく、インターフェースタイプを使用したことに注意してください。これは、さまざまな理由から常に推奨される方法です。

これ(Springを開始しない)が最初の問題です。これを行うとすぐに、構成で他の問題が発生します。それらの1つを解決するのに助けが必要な場合は、新しい質問を投稿する必要があります。

*任意のオブジェクトを注入するためにAspectJウィービングを使用している場合を除きます。

于 2013-03-04T05:19:33.657 に答える
1

DAO クラスにwithのSession代わりにa を注入しています。このよう に である必要がありますSessionFactory@Autowired private Session sessionFactory;SessionFactory@Autowired SessionFactory sessionFactory;

そして、このように使用して、保存などのDAO操作を行います

Session session = sessionFactory.getCurrentSession()
session.persist(entity);

編集

テストケースは次のようになります

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:<path_to_your_appcontext.xml>" })
public class StudentDAOTest {

@Autowired
private StudentDAO studentDAO

@Test
public void test() {
      List<Student> list = studentDAO.getStudentList();
      assertNotNull(list)
}
}
于 2013-03-04T05:50:49.043 に答える