8

私は春+休止状態のアプリケーションをやっています。Tomcat サーバーでアプリケーションを実行すると、例外が発生します。以下は私のコードです。

これは私の Bean 設定ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>WEB-INF/database/db.properties</value>
    </property>
</bean>
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <property name="dataSource">
            <ref bean="dataSource" />
        </property> 
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>Employee.hbm.xml</value>
            </list>
        </property>
    </bean>
    <bean id="employeeBo" class="com.saggezza.employee.bo.impl.EmployeeBoImpl">
        <property name="employeeDao" ref="employeeDao" />
    </bean>

    <bean id="employeeDao" class="com.saggezza.employee.dao.impl.EmployeeDaoImpl">
        <constructor-arg ref="sessionFactory"></constructor-arg>
    </bean>

これは私のdaoクラスです。

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {

    private SessionFactory sessionFactory;
    public EmployeeDaoImpl(SessionFactory sessionfactory){
        this.sessionFactory=sessionfactory;
    }

    @Override
    public List<Employee> getEmployeeDetails() {
        return getHibernateTemplate().find("from Employee");

    }
}

ここでは、別のクラス employeeBo が employeeDaoImpl を呼び出しています。これを実行すると、以下の例外が発生します。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeBo' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Cannot resolve reference to bean 'employeeDao' while setting bean property 'employeeDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeDao' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

誰でもこれを解決するのを助けることができますか? 私は多くのことを試してみましたが、それもグーグルで検索しました.しかし、解決策は得られました.

4

4 に答える 4

4

構成ファイルが 2 つある場合は、'sessionFactory' 定義を複製します。「sessionFactory」定義の 1 つを削除します。IllegalArgumentException の前に重複した Bean 定義の例外が発生します。

編集:あなたのコメントの後、

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {


public EmployeeDaoImpl(SessionFactory sessionfactory){
    setSessionFactory(sessionfactory);
}

@Override
public List<Employee> getEmployeeDetails() {
    return getHibernateTemplate().find("from Employee");

}
}

または、上記のコードでコンストラクターを取り除き、セッター注入を使用して「sessionFactory」を注入しorg.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory)ます。私は後でアプローチすることを好みます。

于 2013-02-23T20:51:32.017 に答える
0

これは古い質問なので、今すぐ解決する必要がありますが、それでも誰かがこの問題に遭遇した場合. 以下が解決策です。

HibernateDAOSupport クラスを拡張し、その afterPropertiesSet() メソッドをオーバーライドすることで、Hibernate DAO サポートを使用できます。

このメソッドは HibernateDAO サポートで呼び出され、その時点で sessionFactory が null であるため、このエラーがスローされます。カスタム クラスでは、このプロパティを明示的に設定してから、親クラスの同じメソッド (つまり、HibernateDAOSupport の addProperties() メソッド) を呼び出すことができます。

package com.techcielo.spring4.hibernate.template;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;

@Component("hibernateTemplate")
public class Hibernate4CustomTemplate extends HibernateTemplate{

    @Autowired(required=true)
    private SessionFactory sessionFactory;
    public void setSessionFactory(SessionFactory sessionFactory) {
        System.out.println("Setting SessionFactory");
        this.sessionFactory = sessionFactory;
        super.setSessionFactory(sessionFactory);
    }

    @Override
    public void afterPropertiesSet() {
    System.out.println("Checking if properties set..."+this.sessionFactory);
    setSessionFactory(sessionFactory);
    super.afterPropertiesSet();
    }
}

以下はサンプルに使用できます!

于 2014-01-05T19:23:49.560 に答える
0

問題は、SessionFactory注入しているタイプがクラスで使用しEmployeeDaoImplたタイプと一致しないことだと思います。SessionFactory

確認できますか?

于 2013-02-24T16:52:36.320 に答える