복붙노트

[SPRING] 클래스에 데이터 소스 빈 삽입 또는 자동 와이어링

SPRING

클래스에 데이터 소스 빈 삽입 또는 자동 와이어링

이것은 매우 초보자 질문일지도 모르지만, 나는 수색하고 나가 나의 이해에있는 큰 간격이 있거나 나는 나가 알아낼 수없는 무언가를 잘못하고있다.

여기 내 컨텍스트 파일에서 발췌 부분입니다.

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${datasource.driverClassName}" />
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
</bean>

<bean id="myBeanOne" class="a.b.c.myBeanOne">
         <property name="dataSource" ref="dataSource" />
</bean>

이제 myBeanOne에서 나는 :

private DataSource dataSource;

private JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource (DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

public void myMethod() {
    String sql = "'My generic SQL update query'";
    try {
        this.jdbcTemplate.update(sql);
    } catch (org.springframework.dao.EmptyResultDataAccessException ex) {
    }
    System.exit(0);
}

setDataSource가 호출 된 줄에서이 코드를 실행하려고하면이 오류가 발생합니다.

ERROR org.springframework.integration.handler.LoggingHandler 
    org.springframework.integration.MessageHandlingException: 
       java.lang.NullPointerException

줄에 : this.jdbcTemplate.update (sql);

이 작업을 수행하기 위해 10 개의 다른 구성을 시도했지만 실제로 그렇게 할 수는 없습니다. 도움이된다면 고맙습니다.

편집 : Luiggi의 의견대로 :

//in yet another classes run method
myBeanOne bOne = SomeOtherClass.create();   //just returns new myBeanOne
bOne.myMethod();

SomeOtherClass 또는이 클래스는 컨텍스트에서 Bean으로 분류되거나 컨텍스트에서 존재하지 않습니다.

나는 이것이 매우 기본적인 질문이라는 것을 알고 있지만 나는 그것에 고심하고있다.

양해 해 주셔서 감사합니다.

해결법

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

    1.주석에서 언급했듯이, 문제는 여러분이 Spring 컨테이너가 그것을 생성하는 대신에 수동으로 빈을 생성한다는 것이다. 기본적으로, 당신은 이것을하고 있습니다 :

    주석에서 언급했듯이, 문제는 여러분이 Spring 컨테이너가 그것을 생성하는 대신에 수동으로 빈을 생성한다는 것이다. 기본적으로, 당신은 이것을하고 있습니다 :

    new MyBeanOne()
    

    그래서 스프링 컨테이너는 여러분이 설정 한 어떤 필드도 삽입 할 수 없으므로 null입니다. jdbcTemplate 필드. 이에 대한 해결책이 몇 가지 있습니다.

    @Configurable 주석을 사용하여이 문제를 처리하는 다른 방법을 찾았습니다. 이 어노테이션으로 빈을 꾸미면 필요에 따라 빈의 새로운 인스턴스를 생성 할 수 있고 Spring은 당신을 위해 스프링 관리 빈의 주입을 관리 할 것이다. 그러나 이것을 달성하기 위해, Spring은 배후에서 aspect를 사용해야하며, 프로젝트의 aspect 사용을 활성화해야한다. 설명은 꽤 길기 때문에이 솔루션에 대해 자세히 설명하는 링크를 제공합니다.

    이 기능을 사용하려면 aspect를 사용하여 런타임에 클래스를 직조 할 JVM을 시작할 때 Java 에이전트를 추가해야합니다.

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

    2.NPE가 실제로 해당 행에 있으면 this.jdbcTemplate은 분명히 널입니다. 이것이 사실이라면 다음 중 하나를 수행하십시오.

    NPE가 실제로 해당 행에 있으면 this.jdbcTemplate은 분명히 널입니다. 이것이 사실이라면 다음 중 하나를 수행하십시오.

  3. from https://stackoverflow.com/questions/17819752/spring-injecting-or-autowiring-datasource-bean-to-class by cc-by-sa and MIT license