복붙노트

[SPRING] @Autowired 객체가 null 값을 얻음

SPRING

@Autowired 객체가 null 값을 얻음

프로젝트를 설정하려고했으나 Spring을 통해 객체를 Autowiring 할 때 실패합니다.

package se.hsr.web;

public class TestRunner {

    public static void main(String[] args) {
        ContactDAO cd = new ContactDAOImpl();
        Contact contact = new Contact();
        contact.setFirstname("Zorro");
        cd.addContact(contact);
    }

}

package se.hsr.web;

이것을 실행하면 cd.addContact가 호출 될 때 NullPointerException이 발생합니다. ContactDaoImpl :

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ContactDAOImpl implements ContactDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public void addContact(Contact contact) {
        sessionFactory.getCurrentSession().save(contact);
    }

내 서블릿 파일 :

    <?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:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan
        base-package="se.hsr.web"/>

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />  

     <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <bean id="contactDAOImpl"
        class="se.hsr.web.ContactDAOImpl"/>

    <context:annotation-config/>

</beans>

내 hibernate.cfg.xml 파일 :

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <mapping class="se.hsr.web.Contact" />
    </session-factory>

</hibernate-configuration>

나는 필레를 가지고있다 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>HSRMVC</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>HSR</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>HSR</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

SessionFactory가 @Autowired를 통해 올바르게 초기화되지 않는다는 오류가 있다고 가정합니다.하지만 그 이유는 무엇입니까? 그것은 단순한 디렉토리 구조 / 파일 경로 문제 일 수 있습니까? 아니면 좀 더 복잡합니까?

미리 감사드립니다.

최신 정보: ContactDAOImpl 클래스 :

@Repository
public class ContactDAOImpl extends HibernateDaoSupport implements ContactDAO{

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    public void addContact(Contact contact) {
        sessionFactory.getCurrentSession().save(contact);
    }

해결법

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

    1.Spring 기능 (autowiring, post 구조 메소드 또는 aspect 호출)을 사용하려면 Spring이 new를 사용하지 않고 인스턴스를 인스턴스화하도록해야한다.

    Spring 기능 (autowiring, post 구조 메소드 또는 aspect 호출)을 사용하려면 Spring이 new를 사용하지 않고 인스턴스를 인스턴스화하도록해야한다.

    예를 들면 :

    public static void main(String[] args) {
        ApplicationContext context = AnnotationConfigApplicationContext("se.hsr.web")
        ContactDAO cd = (ContactDAO)context.getBean("contactDAOImpl");
        Contact contact = new Contact();
        contact.setFirstname("Zorro");
        cd.addContact(contact);
    }
    

    AnnotationConfigApplicationContext는 se.hsr.web 패키지의 클래스에있는 클래스를 검사하여 Spring 주석이있는 클래스를 찾습니다. 스프링 3.0이 작동해야한다. 그 전에 applicationContext.xml 파일에 다음 행을 추가해야합니다.

    <context:component-scan base-package="se.hsr.web" />
    
  2. ==============================

    2.테스트 클래스 상단에 다음이 필요합니다.

    테스트 클래스 상단에 다음이 필요합니다.

    @RunWith(SpringJUnit4ClassRunner.class)
    // ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
    // in the root of the classpath
    @ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
    public class MyTest {
    

    나는 JUnit4를 사용했다. 내 감독.

    어딘가에 응용 프로그램 컨텍스트에서 컨텍스트 구성 태그가 필요하지만 실제로 응용 프로그램 컨텍스트 파일을 열고 ApplicationContext를 만드는 코드에는 아무 것도 표시되지 않습니다. 일반적으로 테스트를위한 설정 방법으로 수행됩니다. 실제로 ApplicationContext를 어딘가에 만들면 더 나은 행운을 누릴 수 있습니다. CLASSPATH에서 XML을 읽고 설정 방법을 살펴보고 도움이되는지 확인하십시오.

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

    3.자동 와이어 링이 작동하려면 Spring 구성에서이 값이 필요합니다.

    자동 와이어 링이 작동하려면 Spring 구성에서이 값이 필요합니다.

    xmlns:context="http://www.springframework.org/schema/context" 
    ....
    <context:annotation-config/>
    
  4. ==============================

    4.@ Component / @ Repository를 DAO / DAOImpl에 추가하십시오.

    @ Component / @ Repository를 DAO / DAOImpl에 추가하십시오.

  5. ==============================

    5.당신은 스프링 컨텍스트 외부에서 POJO를 생성하고있다.

    당신은 스프링 컨텍스트 외부에서 POJO를 생성하고있다.

    "수동으로"인스턴스화 할 수있게하려면 구성에 를 추가 한 다음 DAOImpl에 @Configurable 문의 주석을 달아이 문제를 해결할 수 있습니다

  6. ==============================

    6.Spring 컨텍스트에서 ContactDAO 인스턴스를 검색해야한다. 새로운 키워드로 자신을 시작하고 있습니다.

    Spring 컨텍스트에서 ContactDAO 인스턴스를 검색해야한다. 새로운 키워드로 자신을 시작하고 있습니다.

    아래 링크를 참조하십시오.

    @Autowired annotation은 JUnit 클래스에서 Bean을 삽입 할 수 없다.

    또는 단위 테스트가 아닌 경우

    ClassPathResource resource = new ClassPathResource("beans.xml");
    BeanFactory factory = new XmlBeanFactory(resource);
    beanFactory.getBean("nameOfYourBean");
    

    http://static.springsource.org/spring/docs/2.0.x/reference/beans.html

  7. from https://stackoverflow.com/questions/4816283/autowired-objects-getting-null-value by cc-by-sa and MIT license