2014-10-20 3 views
6

스프링 부트 프로젝트에 여러 클래스가 있습니다. 일부는 @Autowired와 함께 작동하지만 일부는 그렇지 않습니다. 여기 내 코드는 다음과 같습니다스프링 부트 Autowired null

Application.java (@Autowired 작품) :

package com.example.myproject; 

@ComponentScan(basePackages = {"com.example.myproject"}) 
@Configuration 
@EnableAutoConfiguration 
@EnableJpaRepositories(basePackages = "com.example.myproject.repository") 
@PropertySource({"classpath:db.properties", "classpath:soap.properties"}) 
public class Application { 

@Autowired 
private Environment environment; 

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

@Bean 
public SOAPConfiguration soapConfiguration() { 
    SOAPConfiguration SOAPConfiguration = new SOAPConfiguration(); 
    SOAPConfiguration.setUsername(environment.getProperty("SOAP.username")); 
    SOAPConfiguration.setPassword(environment.getProperty("SOAP.password")); 
    SOAPConfiguration.setUrl(environment.getProperty("SOAP.root")); 
    return SOAPConfiguration; 
} 

HomeController (@Autowired 작품) :

package com.example.myproject.controller; 

@Controller 
class HomeController { 

    @Resource 
    MyRepository myRepository; 

이면 MyService을 (@Autowired가 작동하지 않습니다) :

package com.example.myproject.service; 

@Service 
public class MyServiceImpl implements MyService { 

    @Autowired 
    public SOAPConfiguration soapConfiguration; // is null 

    private void init() { 
    log = LogFactory.getLog(MyServiceImpl.class); 
    log.info("starting init, soapConfiguration: " + soapConfiguration); 
    url = soapConfiguration.getUrl(); // booom -> NullPointerException 

SOAPConfiguration이 표시되지 않지만 시도 할 때 내 응용 프로그램이 null 포인터 예외로 중단됩니다. 그것을 액세스하십시오.

나는 많은 스레드를 이미 읽고 봤지만 아직 해결 방법을 찾지 못했습니다. 필요한 정보를 모두 제공해 주셨습니다. 빠진 것이 있으면 알려주세요.

+0

여기서 'init' 메서드는 어디에서 호출합니까? 나는 생성자를 의심한다. –

+0

log.info prints : starting init, soapConfiguration : null – dexBerlin

+0

HomeController.update는 새로운 MyServiceImpl을 만들고 init 메소드를 호출하는 myService.update를 호출합니다. – dexBerlin

답변

8

autowiring이 일어나기 전에 init()으로 전화를 걸 것이라고 생각합니다. init()에 @PostConstruct를 붙이면 모든 스프링 자동 와이어 링 후 자동으로 호출됩니다.

편집 : 귀하의 의견을 본 후, 나는 new MyServiceImpl()을 사용하여 작성하신 것 같습니다. Spring에서 MyServiceImpl 컨트롤을 제거하고 제공합니다. 이 경우에는 자동 연결이 작동하지 않습니다.

+0

@PostContruct 주석을 추가했지만 soapConfiguration은 여전히 ​​null입니다. – dexBerlin

+0

EDITed 대답을 참조하십시오 – sinu

+0

대단히 고마워요,이게 내 문제를 해결했습니다. – dexBerlin

1

구성 클래스의 SOAPConfiguration 클래스에 대한 bean을 만들었습니까? 프로젝트에서 클래스를 자동으로 실행하려면 클래스를 생성해야합니다. 예 :

@Configuration 
public class SomeConfiguration{ 

    @Bean 
    public SOAPConfiguration createSOAPConfiguration(){ 

     return new SOAPConfiguration(); 
    } 

} 

public class SomeOtherClass{ 

    @Autowired 
    private SOAPConfiguration soapConfiguration; 
} 
+0

Application.java가 그렇게해야합니까? 내 설명처럼? – dexBerlin

+0

SOAPConfiguration을 호출하는 Application.java의 메소드가 확실합니까? – furkan3ayraktar

관련 문제