intellij niepoprawnie mówi, że nie znaleziono fasoli typu dla autowired repozytorium

138

Utworzyłem prosty test jednostkowy, ale IntelliJ niepoprawnie wyróżnia go na czerwono. oznaczając to jako błąd

Nie ma fasoli?

wprowadź opis obrazu tutaj

Jak widać poniżej przeszedł test? Więc to musi być Autowired?

wprowadź opis obrazu tutaj

Robbo_UK
źródło
3
IntelliJ czasami daje fałszywie dodatnie błędy autoprzewodów. Na przykład w aplikacjach Spring Boot, w których duża część konfiguracji jest ukryta za EnableAutoConfiguration. Jest na to otwarty problem. Inną przyczyną może być nieprawidłowo skonfigurowany aspekt Spring. To, co zwykle robię w takich sytuacjach, to zmniejszanie ostrości inspekcji, aby była mniej nachalna ...
Bohuslav Burghardt

Odpowiedzi:

177

Miałem ten sam problem podczas tworzenia aplikacji Spring Boot przy użyciu ich @SpringBootApplicationadnotacji. Adnotacja to oznacza @Configuration, @EnableAutoConfigurationi @ComponentScanzgodnie z odniesieniem sprężyny .

Zgodnie z oczekiwaniami nowa adnotacja działała poprawnie, a moja aplikacja działała płynnie, ale Intellij wciąż narzekał na niespełnione @Autowirezależności. Jak tylko zmieniłem z powrotem do używania @Configuration, @EnableAutoConfigurationa @ComponentScanosobno, błędy przestały. Wygląda na to, że Intellij 14.0.3 (i najprawdopodobniej również wcześniejsze wersje) nie jest jeszcze skonfigurowany do rozpoznawania @SpringBootApplicationadnotacji.

Na razie, jeśli błędy tak bardzo Ci przeszkadzają, wróć do tych trzech oddzielnych adnotacji. W przeciwnym razie zignoruj Intellij ... Twoje rozwiązywanie zależności jest poprawnie skonfigurowane, ponieważ test kończy się pomyślnie.

Zawsze pamiętaj...

Człowiek jest zawsze większy niż maszyna.

Abimbola Esuruoso
źródło
1
Problem został rozwiązany w nowszych wersjach Intellij (sprawdzonych w 2017.1)
Sourabh,
45
Nadal dostaję to z 2017.2 i jest to płatna licencja ostateczna.
Thomas Carlisle
1
Dostaję to z 2017.2 i SprintBootTest zewnętrzną klasą i statyczną klasą wewnętrzną SpringBootApplication zgodnie z przykładem testowania Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/ ...
danebez
4
W przypadku nowszych wersji IntelliJ (np. 2017) musisz włączyć wtyczkę Spring Data, a wtedy nie potrzebujesz żadnego z powyższych obejść. Poniżej znajduje się inna odpowiedź, która mówi, jak to zrobić.
Norbert
4
W przypadku IntelliJ 2018.2, używam Spring Boot 2.0.5 i @SpringBootApplicationotrzymywałem ten błąd. Postępowałem zgodnie z radą @ Jaõs Matos, używając scanBasePackagesparametru do @SpringBootApplicationi określając pakiet / przestrzenie nazw, które powinny być skanowane.
Dave Goodchild
53

Dodaj adnotację Spring @Repositorydo klasy repozytorium.

Wiem, że powinno działać bez tej adnotacji. Ale jeśli to dodasz, IntelliJ nie pokaże błędu.

@Repository
public interface YourRepository ...
...

Jeśli używasz Spring Data z rozszerzającą Repositoryklasą, będą to konfliktowe strony. Następnie należy wskazać strony explicity.

import org.springframework.data.repository.Repository;
...

@org.springframework.stereotype.Repository
public interface YourRepository extends Repository<YourClass, Long> {
    ...
}

Następnie możesz automatycznie przypisać swoje repozytorium bez błędów.

@Autowired
YourRepository yourRepository;

Prawdopodobnie nie jest to dobre rozwiązanie (chyba dwukrotnie próbujesz zarejestrować repozytorium). Ale pracuj dla mnie i nie pokazuj błędów.

Może w nowej wersji IntelliJ da się naprawić: https://youtrack.jetbrains.com/issue/IDEA-137023

mkczyk
źródło
3
Zgodnie z tym youtrack.jetbrains.com/issue/IDEA-148113 jest to naprawione w wersji 16 ... (wstrzymuje oddech)
ismoore999
Wydaje się, że @Component również działa. Wygląda na to, że wystarczy wymusić skanowanie interfejsu / klasy
Brett,
Nie musisz już dodawać @Repository. Tylko na wtyczce Spring Data.
Shin Kim
3
Trzy lata później znowu się
zepsuło
Użyłem / @ Mapper dla mojego interfejsu mappera (mybatis). POMYSŁ rzucić to ostrzeżenie. Zmieniłem to na / @ Repository, ostrzeżenie zniknęło.
bzuo
32

Moja wersja IntelliJ IDEA Ultimate (2016.3.4 Build 163) wydaje się to obsługiwać. Rzecz w tym, że musisz mieć włączoną wtyczkę Spring Data.

wprowadź opis obrazu tutaj

Natix
źródło
To rozwiązało również problem dla mnie - wygląda na to, że może to być prawdziwy problem dla każdego, kto inaczej ma poprawnie skonfigurowany kod!
Matsu Q.
5
Nie działa w 2017.2.7. Wtyczka jest włączona, ale ostrzeżenie jest nadal obecne.
brainfrozen
Pracował dla mnie w iJ Ultimate 2018.2.5.
JL_SO,
23

Czasami wymagane jest wskazanie, gdzie @ComponentScan ma skanować w poszukiwaniu składników. Możesz to zrobić przekazując pakiety jako parametr tej adnotacji, np .:

@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})

Jednak, jak już wspomniano, adnotacja @SpringBootApplication zastępuje @ComponentScan, stąd w takich przypadkach należy zrobić to samo:

@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})

Przynajmniej w moim przypadku Intellij przestał narzekać.

João Matos
źródło
2
Jest to zdecydowanie lepsze, czystsze rozwiązanie i może potwierdzić, że usunęło to ostrzeżenie. Dzięki!
Dave Goodchild
2
W moim przypadku miałem @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) i chociaż aplikacja działała dobrze, intellijowi się to nie podobało. Zmiana na @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})naprawioną dla mnie!
GriffoGoes
1
Jest to zdecydowanie najlepsze rozwiązanie, ponieważ jest przenośne między IDE i jasno przekazuje zamiary programistów.
MusikPolice
Używam ostatecznego rozruchu wiosny 2019.3.1 2.2.1 i java 11.0.4. Problem nadal występuje w plikach testów jednostkowych.
garyM
1
to, co zasugerował @GriffoGoes, rozwiązało mój problem, ponieważ używałem struktury wielomodułowej, to było moje najlepsze rozwiązanie
Juan Monsalve
20

Zawsze rozwiązuję ten problem, wykonując następujące czynności ... Ustawienia> Inspekcje> Spring Core> Code, aby przejść od błędu do ostrzeżenia o opcji ważności

wprowadź opis obrazu tutaj

cristianchiess
źródło
2
Poszedłem z tym rozwiązaniem, dopóki nie zostanie naprawiona wiosna: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley
15

Używam spring-boot 2.0 i intellij 2018.1.1 ultimate edition i napotkałem ten sam problem.

Rozwiązałem przez umieszczenie @EnableAutoConfiguration w głównej klasie aplikacji

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
źródło
13
To również "działa" dla mnie, ale potem intellij narzeka: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Sprawdź, czy przegapiłeś adnotację @Service w swojej klasie usług, tak było w moim przypadku.

yankae
źródło
5

Umieszczanie @Componentlub @configurationw pliku konfiguracyjnym bean wydaje się działać, np. Coś takiego:

@Configuration
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

@Component
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}
przewodowy00
źródło
4

Jeśli nie chcesz wprowadzać żadnych zmian w kodzie tylko po to, aby Twoje IDE było szczęśliwe. Rozwiązałem to, dodając wszystkie komponenty do aspektu Spring.

  1. Utwórz grupę o nazwie „Usługa, procesory i routery” lub dowolną inną nazwą;
  2. Usuń i utwórz ponownie „Spring Application Context”, używając utworzonej wcześniej grupy jako nadrzędnej.

wprowadź opis obrazu tutaj

Xiao Peng - ZenUML.com
źródło
4

Tak długo, jak testy przechodzą, jesteś dobry, naciśnij, najeżdżając alt + enterkursorem na błąd i wewnątrz podmenu pierwszej pozycji, którą znajdziesz, Disable Inspectionwybierz to

imal hasaranga perera
źródło
Dzięki. Nawiasem mówiąc, czy istnieje sposób, aby zobaczyć wszystkie wprowadzone zmiany, które nie są domyślne, w jednym widoku w Ustawieniach IntelliJ (abyś wiedział, co zmieniłeś)?
proszek 366
3

Miałem podobny problem w aplikacji Spring Boot. Aplikacja wykorzystuje Feign (syntetyzowanie przez klienta HTTP żądań z interfejsów z adnotacjami). Mając interfejs SomeClientz adnotacją @FeignClient, Feign generuje klasę proxy środowiska wykonawczego implementującą ten interfejs. Kiedy jakiś komponent Spring próbuje automatycznie podłączyć ziarno typu SomeClient, Idea narzeka, że ​​nie SomeClientznaleziono fasoli typu, ponieważ w projekcie nie ma prawdziwej klasy, a Idea nie jest nauczona rozumieć@FeignClient adnotacji w żaden sposób.

Rozwiązanie: dodaj adnotacje do interfejsu SomeClientz @Component. (W naszym przypadku nie używamy @FeignClientadnotacji SomeClientbezpośrednio, raczej używamy metaannotacji, @OurProjectFeignClientktóra jest opatrzona adnotacjami, @FeignClienta dodanie @Componentdo niej adnotacji również działa).

Tomáš Záluský
źródło
Tak, dodanie @Componentdo interfejsu rozwiązuje problem. Ale myślę, że to nie jest właściwa droga ... Moim zdaniem to błąd w IntelliJ IDEA lub żeby nie być tak trudnym IntelliJ IDEA nie jest gotowy na nowsze wersje Feign. Działa bez wcześniejszych @Componentwersji pozorowanych (gdzie @FeignClientadnotacja była org.springframework.cloud.netflix.feignzamiast org.springframework.cloud.openfeign- może to jest przyczyna problemu?). Czy znalazłeś jakieś dalsze szczegóły (może bilet błędu) na ten temat?
Josef Reichardt,
Nie, nie mam, chociaż moja obudowa (która nie działała bez @Component) pochodzi @FeignClientz org.springframework.cloud.netflix.feignpaczki.
Tomáš Záluský
3
Problem w narzędziu do śledzenia błędów JetBrains jest tutaj: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt
3

Skonfiguruj kontekst aplikacji i wszystko będzie dobrze.

wprowadź opis obrazu tutaj

Arayik Harutyunyan
źródło
2

I ostatnia ważna informacja - dodaj ją, ComponentScanaby aplikacja wiedziała o rzeczach, które musi wykonać. Nie ma to znaczenia w przypadku tego pytania. Jeśli jednak w ogóle nie @autowiringjest wykonywany, prawdopodobnie jest to Twoje rozwiązanie.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
źródło
To ma sens i załatwiło mi sprawę. Po co wyłączać ostrzeżenia? Ostrzeżenia powinny działać zgodnie z oczekiwaniami!
WebComer
2

Musisz tylko dodać

@ComponentScan("package/include/your/annotation/component") w AppConfiguration.java.

Ponieważ myślę, że Twój AppConfiguraion.javapakiet jest głębszy niż pakiet składnika adnotacji (@Service, @Component ...),

takie jak "package/include/your/annotation/component/deeper/config".

sfwn
źródło
@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov
2

Miałem podobny problem w swojej aplikacji. Po dodaniu adnotacji zniknęły nieprawidłowe wyróżnienia.

@ContextConfiguration(classes = {...})
K. Gol
źródło
tylko dla pakietów testowych!
Iakov Senatov
2

Używam tej adnotacji, aby ukryć ten błąd, gdy pojawia się w IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
źródło
Kiedy autowoduje się konstruktorem, jest to@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren,
2

Dla mnie rozwiązaniem było umieszczenie @EnableAutoConfigurationw klasie Application pod @SpringBootApplicationjej podkreśleniem, ponieważ jest zbędne. Usuń go i voila, wszystkie ostrzeżenia dotyczące brakujących fasoli zniknęły! Głupia wiosna ...

Farkas Archie Bako
źródło
2

w moim przypadku katalog, do którego próbowałem @Autowired, nie był na tym samym poziomie,

po ustawieniu go na tym samym poziomie struktury błąd zniknął

mam nadzieję, że to komuś pomoże!

Davel_AG
źródło
1

Moim rozwiązaniem tego problemu w mojej aplikacji do rozruchu wiosennego było otwarcie kontekstu aplikacji sprężynowej i ręczne dodanie klasy dla brakującej fasoli autowired!

(dostęp przez menu Project Structure lub okno narzędzi sprężynowych ... edytuj "Spring Application Context")

Więc zamiast SpringApplicationContext zawierającego tylko moją konfigurację sprężyny ExampleApplication zawiera ona również brakującą Bean:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: Komunikat o błędzie zniknął!

UV
źródło
1

Wydaje się, że nadal jest to błąd w najnowszym IntelliJu i ma to związek z możliwym problemem z pamięcią podręczną?

Jeśli dodasz wspomnianą powyżej adnotację @Repository jako mk321, zapisz, a następnie usuń adnotację i zapisz ponownie, to rozwiązuje problem.

Jensen Buck
źródło
1

Wszystko, co musisz zrobić, aby to zadziałało, to następujący kod:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
olammy
źródło
1

Po prostu musiałem użyć @EnableAutoConfiguration, aby go rozwiązać, jednak ten błąd nie miał wpływu na funkcjonalność.

Smart Coder
źródło
1

Można to rozwiązać umieszczając @EnableAutoConfiguration w głównej klasie aplikacji rozruchowej Spring.

Nirbhay Rana
źródło
0

Czasami - to znaczy w moim przypadku - przyczyną jest zły import. Przypadkowo zaimportowałem

import org.jvnet.hk2.annotations.Service

zamiast

import org.springframework.stereotype.Service

ślepo akceptując pierwszy wybór w sugerowanych importach Idea. Zajęło mi to kilka minut za pierwszym razem :-)

Christoph Grimmer-Dietrich
źródło
0

Co zaskakujące, projekt zorientowany na Feign, który z powodzeniem działał z Eclipse, nie mógł działać w InteliJ. Po uruchomieniu aplikacji InteliJ narzekał na klienta Feign, którego próbowałem wstrzyknąć do warstwy serviceImpl, mówiąc: pole personRestClient (mój klient Feign) w ... wymagało fasoli typu ... którego nie można było znaleźć. Rozważ zdefiniowanie fasoli typu „....” w swojej konfiguracji.

Marnowałem dużo czasu, próbując zrozumieć, co jest nie tak. Znalazłem rozwiązanie (dla InteliJ), którego nie do końca rozumiem:

  1. Alt Shift F10 (lub menu uruchamiania)
  2. Wybierz „Edytuj konfigurację”
  3. W oknie konfiguracji zaznacz pole wyboru „uwzględnij zależności z zakresem„ Dostarczony ””
  4. Uruchom aplikację

Lub wybierz Eclipse :)

ylev
źródło
0

Sprawdź, czy paczka twojej fasoli jest napisana poprawnie

//Check if this is written right 
package com.package1.package2.package3


import ...

@Service
class ServiceX {

  ...

}
Jöcker
źródło
0

Użyj @AutoConfigureMockMvc dla klasy testowej.

Harshad Thombare
źródło
0

Rozwiązałem problem, instalując wtyczkę mybatis w IDEA. Po zainstalowaniu wtyczki Mybatis zniknęła.

Snkpty
źródło
0

proste, musisz zrobić 2 kroki

  1. dodaj zależność od hibernacji rdzenia
  2. zmień @Autowired na @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
źródło
Wyjaśnij swoją odpowiedź.
mentallurg
0

IntelliJ IDEA Ultimate

Dodaj swoją główną klasę do kontekstu aplikacji IntelliJ Spring, na przykład Application.java

File -> Project Structure..

lewa strona: Ustawienia projektu -> Moduły

prawa strona: znajdź w strukturze swojego pakietu Springi dodaj+ Application.java

Anton Bondarenko
źródło
Odpowiada odpowiedzi UV
Anton Bondarenko