2017-10-15 3 views
1

저는 Spring을 기반으로 한 작은 서비스를 구현했습니다. DemoController 내에서 Demo 클래스를 autowire하고 싶습니다. 따라서 beans.xml 파일에서 값을 정의했습니다. 모든 것이 컴파일되기 때문에 봄이 콩을 찾은 것 같습니다. 그러나 서비스의 반환 값은 다음과 같습니다Autowired 클래스는 null 값을 반환합니다.

{ "valueUno": 0, "valueDue"널 (null)}

DemoApplication :

@SpringBootApplication 
@ComponentScan({"com"}) 
@EnableAutoConfiguration 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 

    } 
} 

데모 :

@Component 
public class Demo { 

    private int valueUno; 
    private String valueDue; 
    //getter, setter.... 
} 

DemoController :

@RestController 
public class DemoController { 

    @Autowired 
    private Demo demo; 

    @RequestMapping(
      value = "/welcome", 
      method = RequestMethod.GET 
      ) 
    public HttpEntity<Demo> getMessage() { 
     return new HttpEntity<Demo>(this.demo); 
    } 

} 

beans.xml 환경은 :

<?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.xsd"> 
    <bean id="demo" class="com.example.demo.Demo"> 
     <property name="valueUno" value="50"></property> 
     <property name="valueDue" value="Hello"></property> 
    </bean> 
</beans> 

모든 것이 하나 개의 패키지 안에 있습니다. 나는 그것을 얻지 못한다 ...

+1

그래서 주석을 통해 XML 설정과 자동 배선을 혼합하고 있습니까? – rkosegi

답변

4

으로 Demo 주석을 달았습니다. 따라서 Spring은 컴포넌트 스캔 중에 (기본 클래스 인 @ComponentScan({"com"})으로 설정) 기본 생성자를 사용하여이 클래스의 bean을 인스턴스화 한 다음 DemoController에 삽입 (autowires)합니다. 따라서 autowired bean은 beans.xml에 정의 된 bean이 아닙니다.

문제를 해결하는 두 가지 방법이 있습니다 : 당신이 XML 구성으로 이동하려면

1), Demo 클래스에서 @Component를 제거하고 컨트롤러 클래스에 @ImportResource("classpath:beans.xml") 주석을 추가가.

2) JavaConfig (주석과 함께 가고 싶은 경우),이 같은 별도의 클래스를 추가해야합니다 :

@Configuration 
public class MyConfiguration { 
    @Bean 
    public Demo demo() { 
     return new Demo(50, "Hello"); // or initialize using setters 
    } 
} 

을 ... 그리고 당신의 컨트롤러 클래스에 @Import(MyConfiguration.class) 주석을 추가하고,에서 @Component을 제거 Demo 클래스입니다.

@Bean 
    public Demo demo() { 
     Demo demo = new Demo(); 
     demo.setValueUno(50); 
     demo.setValueDue("Hello"); 
     return demo; 
    } 

직접 DemoApplication 클래스 또는 구성 클래스에이 구성을 추가 할 수 있습니다 : @PresentProgrammer, 당신은 다음과 같은 자바 구성으로 XML 구성을 이동할 수 있습니다 말씀에 대한 해결책으로

+0

따라서 솔루션은 xml 선언을 버리고 매개 변수가없는 생성자를 만들어 사용하려는 기본값으로 필드를 설정합니다. –

+0

답변에 가능한 해결책이 추가되었습니다. – PresentProgrammer

2

@Configuration 
public class BeanConfiguration { 

    //Bean Configurations 

} 

자세한 내용은 Java-based container configuration Spring 설명서를 참조하십시오.

+0

알았습니다. 하지만 XML 파일을 사용하여 값을 정의하려면 어떻게해야합니까?봄이 파일을 찾을 수없는 것 같습니다. – Stev

관련 문제