2014-10-20 22 views
6

Mam kilka klas w projekcie Spring Boot, niektóre pracuję z @Autowired, inne nie. Oto mój kod następująco:Spring Boot Autowired null

Application.java (@Autowired robót):

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 działa):

package com.example.myproject.controller; 

@Controller 
class HomeController { 

    @Resource 
    MyRepository myRepository; 

MyService (@Autowired nie działa):

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 

Nie otrzymuję konfiguracji SOAP, ale moja aplikacja zrywa z wyjątkiem wskaźnika pustego, gdy próbuję aby uzyskać do niego dostęp.

Przeczytałem już wiele wątków i przeglądałem, ale nie znalazłem jeszcze rozwiązania. Próbowałem dostarczyć wszystkie niezbędne informacje, proszę dać mi znać, jeśli coś nie trafi.

+0

Skąd nazwałaś metodę "init"? Podejrzewam konstruktora. –

+0

drukuje log.info: start init, soapConfiguration: null – dexBerlin

+0

HomeController.update tworzy nowy MyServiceImpl i wywołuje myService.update, który wywołuje jego metodę init. – dexBerlin

Odpowiedz

8

Podejrzewam, że dzwonisz pod numer init(), zanim rozpocznie się proces wypalania. Napisz adnotację init() za pomocą @PostConstruct, aby wywołać ją automatycznie po zakończeniu autouzupełniania sprężyny.

EDYCJA: po obejrzeniu komentarza, domyślam się, że tworzysz go za pomocą new MyServiceImpl(). To odbiera kontrolę nad MyServiceImpl od wiosny i daje ci to. Autowiring nie zadziała w takim przypadku:

+0

Dodałem adnotację @PostContruct, ale konfiguracja mydła nadal ma wartość null. – dexBerlin

+0

zobacz EDYTOWANĄ odpowiedź – sinu

+0

Dziękuję bardzo, to rozwiązało mój problem. – dexBerlin

1

Czy utworzyłeś komponent bean dla konfiguracji SOAPCon klasy w dowolnej klasie konfiguracji? Jeśli chcesz wyposażyć klasę w swój projekt, musisz utworzyć dla niej komponent. Na przykład:

@Configuration 
public class SomeConfiguration{ 

    @Bean 
    public SOAPConfiguration createSOAPConfiguration(){ 

     return new SOAPConfiguration(); 
    } 

} 

public class SomeOtherClass{ 

    @Autowired 
    private SOAPConfiguration soapConfiguration; 
} 
+0

Aplikacja powinna to zrobić Application.java? Jak w moim wyjaśnieniu? – dexBerlin

+0

Czy na pewno metoda na Application.java wymagała konfiguracji SOAP? – furkan3ayraktar

Powiązane problemy