Otrzymuję następujący błąd:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.
Action:
Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.
Nigdy wcześniej nie widziałem tego błędu, ale to dziwne, że @Autowire nie działa. Oto struktura projektu:
Interfejs kandydata
public interface Applicant {
TApplicant findBySSN(String ssn) throws ServletException;
void deleteByssn(String ssn) throws ServletException;
void createApplicant(TApplicant tApplicant) throws ServletException;
void updateApplicant(TApplicant tApplicant) throws ServletException;
List<TApplicant> getAllApplicants() throws ServletException;
}
ApplicantImpl
@Service
@Transactional
public class ApplicantImpl implements Applicant {
private static Log log = LogFactory.getLog(ApplicantImpl.class);
private TApplicantRepository applicantRepo;
@Override
public List<TApplicant> getAllApplicants() throws ServletException {
List<TApplicant> applicantList = applicantRepo.findAll();
return applicantList;
}
}
Teraz powinienem mieć tylko Autowire Applicant i mieć dostęp do niego, jednak w tym przypadku nie działa, gdy dzwonię w moim @RestController:
@RestController
public class RequestController extends LoggingAware {
private Applicant applicant;
@Autowired
public void setApplicant(Applicant applicant){
this.applicant = applicant;
}
@RequestMapping(value="/", method = RequestMethod.GET)
public String helloWorld() {
try {
List<TApplicant> applicantList = applicant.getAllApplicants();
for (TApplicant tApplicant : applicantList){
System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
}
return "home";
}
catch (ServletException e) {
e.printStackTrace();
}
return "error";
}
}
------------------------ AKTUALIZACJA 1 -----------------------
dodałem
@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
i błąd zniknął, ale nic się nie stało. Jednak kiedy skomentowałem wszystko, czym zajmowałem Applicant
się RestController
przed dodaniem, @ComponentScan()
byłem w stanie zwrócić ciąg znaków UI
, co oznacza, że RestController
działałem, teraz jest pomijany. Teraz jestem brzydka Whitelabel Error Page
.
--------------------- AKTUALIZACJA 2 --------------------------- ---
Dodałem podstawowe opakowanie fasoli, na którą narzekał. Błąd odczytuje:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.
Action:
Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.
dodałem @ComponentScan
@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
---------------------------- Aktualizacja 3 -------------------- -
dodanie:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
wciąż narzeka na moją ApplicantImpl
klasę, w której @Autowires
mam repozytorium TApplicantRepository
.
źródło
Odpowiedzi:
Może to być spowodowane tym, że projekt został podzielony na różne moduły.
źródło
@EntityScan
i@EnableJpaRepositories
przy odpowiednich nazwach pakietów zadziałało dla mnie.Jest szansa ...
Możecie być brakuje
@Service
,@Repository
adnotacja na swoich odpowiednich klas implementacyjnych.źródło
Wygląda na to, że Twoja klasa kandydata nie została przeskanowana. Domyślnie
@SpringBootApplication
przeskanowane zostaną wszystkie pakiety zaczynające się od katalogu głównego jako klasy, do której wstawiłeś.załóżmy, że Twoja
main
klasa „WebServiceApplication” znajduje się w „com.service.something
”, a następnie wszystkie komponenty, które należą do kategorii „com.service.something
”, są skanowane i „com.service.applicant
” nie będą skanowane.Możesz albo zrestrukturyzować swoje pakiety, aby „WebServiceApplication” znalazło się w pakiecie głównym, a wszystkie inne składniki stały się częścią tego pakietu głównego. Lub możesz dołączyć
@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
itp. Tak, aby „WSZYSTKIE” komponenty były skanowane i inicjalizowane w pojemniku sprężyny.Aktualizacja na podstawie komentarza
Jeśli masz wiele modułów, które są zarządzane przez maven / gradle, wszystkie potrzeby wiosny to pakiet do skanowania. Nakazujesz spring przeskanować „com.module1” i masz inny moduł, którego nazwa pakietu głównego to „com.module2”, te komponenty nie zostaną przeskanowane. Możesz nawet nakazać Springowi skanowanie „com”, które następnie przeskanuje wszystkie komponenty w „
com.module1.
” i „com.module2.
”źródło
build.gradle
. Tebuild.gradle
nazwy modułów są dodawane dodependencies
modułu za pomocą metody main. Dlatego kiedy zobaczyłeś@ComponentScan("module-service")
, pomyślałem, że to zadziała. Jednak w środkumodule-service
ma jedno opakowanie. Więc moje pytanie, jak by to wyglądało? Czy mam tylko nazwać nazwę pakietu lub nazwę modułu, czy w jakiś sposób oba?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@SpringBootApplication(scanBasePackages= "com")
i narzeka na repozytorium JPA. Dziękuję Ci bardzo. Nie wiedziałem, że spring przeskanuje wszystkie pakiety zaczynające się od „com”, jeśli wykonasz powyższe.Zasadniczo dzieje się tak, gdy masz aplikację klasową w „innym pakiecie”. Na przykład:
Rozwiązuję z tym problem w Application.class
Innym mniej eleganckim sposobem jest: umieszczenie wszystkich klas konfiguracyjnych w tym samym pakiecie.
źródło
@ComponentScan
w powyższym scenariuszu. Ponieważ twójApplication.class
(który ma@SpringBootApplication
adnotację) jest umieszczony, wcom.server
którym i tak jest korzeń zarówno dla,com.server.config
jak icom.server.repository
.@EnableMongoRepositories
?W moim przypadku popełniłem straszny błąd. włożyłem
@Service
się do interfejsu serwisowego.Aby to naprawić, położyłem
@Service
na implementację plik serwisowy i u mnie zadziałało.źródło
Jeśli fasola znajduje się w tym samym pakiecie, w którym jest @Autowired, nigdy nie spowoduje takiego problemu. Jednak ziarna nie są domyślnie dostępne z różnych pakietów. Aby rozwiązać ten problem, wykonaj następujące kroki:
import org.springframework.context.annotation.ComponentScan;
źródło
Myślę, że możesz to uprościć, dodając adnotacje do repozytorium z @Repository, a następnie zostanie ono włączone automatycznie przez Spring Framework.
źródło
W moim przypadku te dwie opcje zadziałały.
in
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
obejmuje również pakiet, który zawieraApplication.class
na liście, lubPo prostu dodaj
@EnableAutoConfiguration
; automatycznie rozpoznaje wszystkie fasolki wiosenne.źródło
Może się to również zdarzyć, jeśli używasz Lombok i dodasz pola
@RequiredArgsConstructor
i@NonNull
dla, ale niektóre z twoich pól nie mają zostać wstrzyknięte w konstruktorze. To tylko jedna z możliwości uzyskania tego samego błędu.W moim przypadku błąd powiedział mi, w jakim kontrolerze jest problem, po usunięciu
@NonNull
aplikacji wystartowała dobrzeźródło
Napotkałem znany problem w moim wielomodułowym projekcie Mavena ze Spring Boot 2. Problem dotyczył nazewnictwa moich pakietów w modułach podrzędnych Mavena.
@SpringBootApplication zawiera wiele komponentów, takich jak - @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization i tak dalej. I umieszcza @ComponentScan w pakiecie kosmicznym com. *******. Ta część pakietu com. *******. Przestrzeń musi być wspólna dla wszystkich modułów.
Aby to naprawić:
źródło
Szukałem odpowiedzi online, ale wydaje mi się, że nie ma jednego właściwego rozwiązania w moim przypadku: na samym początku wszystko działa tak:
Następnie próbuję dodać mapę do buforowania czegoś i wygląda to tak:
Bum!
Usunąłem
@AllArgsConstructor(onConstructor = @__(@Autowired))
i dodać@Autowired
do siebierepository
iservice
wyjątkiemMap<String, String>
. Po prostu działa jak wcześniej.Mam nadzieję, że to może być pomocne.
źródło
U mnie zadziałało po dodaniu poniższej adnotacji w aplikacji:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Otrzymałem poniższy błąd:
źródło
Adnotacja @Configuration po prostu rozwiąże błąd
źródło
Ten błąd pojawi się również, jeśli przypadkowo zdefiniujesz tę samą ziarno w dwóch różnych klasach. To mi się przydarzyło. Komunikat o błędzie był mylący. Po usunięciu dodatkowego ziarna problem został rozwiązany.
źródło
źródło
Może się tak zdarzyć, jeśli klasa @Service jest oznaczona jako abstrakcyjna.
źródło
Jeśli zależność Twojej klasy jest zarządzana przez Spring, ten problem może wystąpić, jeśli zapomnimy dodać domyślnego / pustego konstruktora arg w naszej klasie POJO.
źródło
To może komuś pomóc. Miałem ten sam problem, ten sam komunikat o błędzie, to samo wszystko. Próbowałem rozwiązań z innych odpowiedzi, ale nie pomogło, dopóki nie zdałem sobie sprawy, że fasola, której używam, ma taką samą nazwę, jak ta, która jest w rzeczywistości autowredowana. Stało się to w trakcie refaktora, więc musiałem zmienić nazwę klasy, co dało wynik pozytywny. Twoje zdrowie
źródło
Miałem ten sam problem. Repozytorium Mongo DB zostało zidentyfikowane przez Spring boot, ale nie tworzyło Bean dla interfejsu repozytorium, który rozszerzył repozytorium mongo.
Problemem w moim przypadku była nieprawidłowa specyfikacja wersji w maven pom dla "wiosna + mango". Zmieniłem identyfikator grupy artefaktu i wszystko działało jak magia. adnotacje nie są potrzebne, bo o wszystko zadbał sprężynowy but.
Podczas rozwiązywania problemu szukałem rozwiązań w całej sieci i zdałem sobie sprawę, że ten problem jest w rzeczywistości związany z konfiguracją projektu, każdy, kto ma do czynienia z tym problemem, powinien najpierw sprawdzić konfigurację swojego projektu i włączyć debugowanie od wiosny, aby uzyskać więcej informacji na temat niepowodzenia i zwrócić szczególną uwagę na gdzie dokładnie w procesie tworzenie się nie powiodło.
źródło
W moim przypadku ten błąd pojawia się, ponieważ mój import był nieprawidłowy, na przykład za pomocą sprężyny import pojawia się automatycznie:
ale potrzebowałem:
źródło
Miałem przypadek, w którym muszę wstrzyknąć RestTemplate do klasy usług. Jednak RestTemplate nie może zostać odebrany przez klasę usługi. To, co zrobiłem, to utworzenie klasy opakowania w tym samym pakiecie co główna aplikacja i oznaczenie opakowania jako Component i automatyczne połączenie tego komponentu w klasie usługi. Problem rozwiązany. mam nadzieję, że to również działa dla Ciebie
źródło
Mój błąd polegał na tym, że uwzględniłem:
zamiast:
źródło
Myślę, że brakuje Ci adnotacji @Bean w kontrolerze żądań
Dodaj Bean do swojego pliku. To rozwiązało mój problem.
Otrzymałem to rozwiązanie, gdy uczyłem się Spring Boot z tutorialspoint
źródło
Dodanie zależności Spring Boot Data JPA Starter rozwiązało problem.
Maven
Gradle
Możesz też przejść bezpośrednio tutaj
źródło
Jeśli używasz
interface
, możesz rozszerzyćCrudRepository<Applicant,Long>
o@Repository
adnotację.źródło
Problem może się również pojawić, gdy używasz na przykład
@EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)
a później zmienisz nazwę pakietu lub przeniesiesz go w inne miejsce.Bardzo często spotykaliśmy się z tym w ramach wielomodułowego projektu maven i wiosennego buta
źródło
Jest szansa, że próbujesz @autowired z interfejsem przed implementować interfejs.
przykładowe rozwiązanie:
źródło
Usuń konfigurację typu adnotacji, taką jak @Service, z metody uruchamiania wątku.
źródło
Spróbuj skonfigurować strukturę projektu, jak podano poniżej:
Umieść wszystkie repozytoria, usługi, pakiety w pakiecie podrzędnym pakietu głównego:
źródło
Przypominamy, że wiosna nie skanuje świata, używa skanowania ukierunkowanego, co oznacza wszystko, co znajduje się pod opakowaniem, w którym przechowywane są pliki springbootapplication. dlatego ten błąd „Rozważ zdefiniowanie komponentu bean typu„ pakiet ”w swojej konfiguracji [Spring-Boot]” może pojawić się, ponieważ masz interfejsy usług w innym pakiecie springbootapplication.
źródło