복붙노트

[SPRING] java.lang.IllegalArgumentException : Spring + 최대 절전 모드에서 'sessionFactory'또는 'hibernateTemplate'이 필요합니다.

SPRING

java.lang.IllegalArgumentException : Spring + 최대 절전 모드에서 'sessionFactory'또는 'hibernateTemplate'이 필요합니다.

나는 봄 + 최대 절전 응용 프로그램을하고있다. Tomcat 서버에서 응용 프로그램을 실행할 때 예외가 발생합니다. 아래는 제 코드입니다.

이것은 나의 빈 설정 파일이다.

<?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

아무도이 문제를 해결할 수 있습니까? 나는 그것을 많이 시도하고 구글도 시도했다. 그러나 그 해결책을 얻었다.

해결법

  1. ==============================

    1.두 개의 구성 파일이있는 경우 'sessionFactory'정의가 복제됩니다. 'sessionFactory'정의 중 하나를 제거하십시오. IllegalArgumentException 전에 중복 bean 정의 예외가 생겼을 것이다.

    두 개의 구성 파일이있는 경우 '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)를 참조하십시오. 나는 나중에 접근하는 것을 더 좋아한다.

  2. ==============================

    2.나는 문제가 EmployeeDaoImpl에서 주입하는 SessionFactory 유형이 클래스에서 사용한 SessionFactory 유형과 일치하지 않는다고 생각한다.

    나는 문제가 EmployeeDaoImpl에서 주입하는 SessionFactory 유형이 클래스에서 사용한 SessionFactory 유형과 일치하지 않는다고 생각한다.

    그것을 확인할 수 있습니까?

  3. ==============================

    3.이것은 오래된 질문이므로 지금 해결해야하지만 누군가가이 문제를 우연히 만난다면 여전히 해결되어야합니다. 다음은 해결책입니다.

    이것은 오래된 질문이므로 지금 해결해야하지만 누군가가이 문제를 우연히 만난다면 여전히 해결되어야합니다. 다음은 해결책입니다.

    Hibernate DAO Support는 HibernateDAOSupport 클래스를 확장하고 그것의 afterPropertiesSet () 메소드를 오버라이드함으로써 사용할 수있다.

    이 메소드는 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();
        }
    }
    

    다음 샘플을 사용할 수 있습니다!

  4. from https://stackoverflow.com/questions/15045468/java-lang-illegalargumentexception-sessionfactory-or-hibernatetemplate-is-r by cc-by-sa and MIT license