8

我正在做 spring + hibernate 应用程序。当我在 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>

这是我的道课。

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

如果您有两个配置文件,则复制“sessionFactory”定义。删除“sessionFactory”定义之一。在 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");

}
}

或摆脱上面代码中的构造函数并使用 setter injection 注入“sessionFactory” 。参见org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory)。我更喜欢后来的方法。

于 2013-02-23T20:51:32.017 回答
0

我认为问题在于SessionFactory您注入EmployeeDaoImpl的类型与您在课堂上使用的类型不匹配SessionFactory

你能检查一下吗?

于 2013-02-24T16:52:36.320 回答
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

我遇到了同样的问题,并通过使用Autowired带有EntityManagerFactory. Keyur的答案是正确的

@Service
class EmployeeDaoImpl @Autowired constructor(
        factory: EntityManagerFactory
) : HibernateDaoSupport(), EmployeeDao {

    init {
        if (factory.unwrap(SessionFactory::class.java) == null) {
            throw NullPointerException("factory is not a hibernate factory")
        }
        setSessionFactory(factory.unwrap(SessionFactory::class.java))
    }
    ...

}
于 2020-06-24T16:20:43.863 回答