2015-12-19 21 views
10

Mam aplikację Spring boot.Spring Boot @autowired nie działa, zajęcia w różnych pakietach

otrzymuję następujący błąd

org.springframework.beans.factory.BeanCreationException: Błąd tworzeniu Bean z nazwą 'birthdayController': Wtrysk z autowired zależności powiodło; wyjątek zagnieżdżony to org.springframework.beans.factory.BeanCreationException: nie można pole autowire: prywatne com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository; zagnieżdżone wyjątek org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie kwalifikacyjna fasoli Typ [com.esri.birthdays.dao.BirthdayRepository] znaleziono zależność: oczekuje przynajmniej 1 fasoli, które kwalifikuje się jako autowire kandydatem do zależność. adnotacje zależnością {@ org.springframework.beans.factory.annotation.Autowired (wymagane = prawdziwy)} w org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:334) ~ [sprężynowy beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1214) ~ [spring-beans-4.2.4.RELEASE .jar: 4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:543) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4. WYCOFANIE] at org.springframework.beans.factory.support.AbstractAutowir eCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:482) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory. Java: 306) ~ [wiosna-fasola-4.2.4.RELEASE.jar: 4.2.4.RELEASE] na lub

Poniżej kod z mojego repozytorium klasy

package com.esri.birthdays.dao; 
import com.esri.birthdays.model.BirthDay; 
public interface BirthdayRepository extends MongoRepository<BirthDay,String> { 
    public BirthDay findByFirstName(String firstName); 
} 

Poniżej kontroler.

package com.esri.birthdays.controller; 
@RestController 
public class BirthdayController { 

    @Autowired 
    private BirthdayRepository repository; 

Działa, jeśli są w tym samym opakowaniu. Nie wiem, dlaczego

+0

W jakim opakowaniu jest Twoja główna klasa? Czy skanowanie komponentów obejmuje zarówno pakiety repozytoriów, jak i kontrolerów? –

Odpowiedz

1

Spróbuj opisać swoją klasę konfiguracji za pomocą adnotacji @ComponentScan("com.esri.birthdays"). Mówiąc ogólnie: jeśli posiadasz podpakiety w swoim projekcie, musisz wyszukać odpowiednie klasy w katalogu głównym projektu. Przypuszczam, że w twoim przypadku będzie to "com.esri.birthdays". Nie będziesz potrzebować skanera ComponentScan, jeśli nie masz w projekcie żadnego opakowania dodatkowego.

0

Spróbuj tego:

@Repository 
    @Qualifier("birthdayRepository") 
    public interface BirthdayRepository extends MongoRepository<BirthDay,String> { 
     public BirthDay findByFirstName(String firstName); 
    } 

A gdy wstrzykiwanie Fasola:

@Autowired 
    @Qualifier("birthdayRepository") 
    private BirthdayRepository repository; 

Jeśli nie, sprawdź swój CoponentScan w config.

35

Podczas korzystania @SpringBootApplication adnotacji na przykład w pakiecie

com.company.config

będzie automatycznie dokonać skanowania składnik tak:

@ComponentScan("com.company.config") 

Więc to będzie NIE skanuj pakietów, takich jak com.company.controller itp. Dlatego właśnie musisz zadeklarować swoje @SpringBootApplication w pakiecie na poziomie wcześniejszym niż norma l pakiety takie jak ten: com.company lub użyj scanBasePackages własności, podobnie jak to:

@SpringBootApplication(scanBasePackages = { "com.company" }) 

LUB componentScan:

@SpringBootApplication 
@ComponentScan("com.company") 


2

Wiosna Boot będzie obsługiwać te repozytoria automatycznie, o ile są one zawarte w tym samym pakiecie (lub pod-pakiecie) twojej klasy @SpringBootApplication. Aby uzyskać większą kontrolę nad procesem rejestracji, można użyć adnotacji @EnableMongoRepositories. spring.io guides

@SpringBootApplication 
@EnableMongoRepositories(basePackages = {"RepositoryPackage"}) 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
3

Po prostu umieść paczki w tagu @SpringBootApplication.

@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....}) 

Daj mi znać.

2

W przypadku tego rodzaju problemu doszedłem do wprowadzenia adnotacji @Service na nowo utworzonej klasie usług, a następnie wybrano autowire. Spróbuj więc sprawdzić te klasy, które nie są automatycznie sprawdzane, czy wymagają odpowiednich odpowiednich adnotacji (takich jak @Controller, @Service itd.) Zastosowanych do nich, a następnie spróbuj ponownie zbudować projekt.

1

W moim przypadku @component nie działał, ponieważ zainicjowałem tę instancję klasy, używając new <classname>().

Jeśli zainicjujemy instancję zwykłą metodą Java w dowolnym miejscu kodu, to wiosna nie doda tego składnika do kontenera IOC.

Powiązane problemy