IntelliJ IDEA wyświetla błędy podczas korzystania z adnotacji @Autowired Springa

102

IntelliJ IDEA wyświetla błędy, gdy używam @Autowiredadnotacji Springa w klasie, ale klasa działa bez problemu.

Oto ten komunikat o błędzie:

Składniki autoprzewodowane muszą być zdefiniowane w prawidłowym elemencie wiosennym (@ Component / @ Service itp.) Mniej ... (Ctrl + F1) Sprawdza problemy z przewodami automatycznymi w klasie fasoli.

Vainlyh
źródło
5
spróbuj tego użyć: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob
Mam ten sam błąd dla moich klas testów integracji. Myślę, że użycie adnotacji @SupressWarnings jest dobrym rozwiązaniem.
Kevin Wittek
Intellij 2016.2 robi to z moim projektem danych Spring Boot / Spring. Który plik analizuje Intellij, aby ustalić, jakie ziarna istnieją?
Adam
2
Musiałem użyć @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009
3
Do użycia IntelliJ IDEA 2017.3.1 (Ultimate Edition)@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Odpowiedzi:

31

Miałem ten sam problem z IntelliJ IDEA 13.1.4. Rozwiązałem go, usuwając aspekt Spring (Plik-> Struktura projektu) i pozostawiając po prostu pokazanie „Wykrywanie”.

Jose Leon
źródło
36
Ale co, jeśli faktycznie zapomnisz dodać adnotację do fasoli. Nie dostaniesz żadnego ostrzeżenia?
Cleankod
22

Jeśli wiesz, że fasola istnieje i to tylko problem z inspekcjami, po prostu dodaj przed deklaracją zmiennej:

@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;

Czasami IntelliJ nie może rozstrzygnąć, czy fasola została zadeklarowana, na przykład gdy komponent jest dołączony warunkowo, a rozwiązanie warunku następuje w czasie wykonywania.

lanoxx
źródło
21

Naprawiłem to, dodając ostrzeżenie o wyłączeniu:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....
user3580264
źródło
19

Tutaj jest ten sam błąd!

Wygląda na to, że Intellij nie może zweryfikować, czy implementacja klasy to @Service czy @Component.

Rozwiąż to po prostu zmieniając się z błędu na ostrzeżenie (naciśnięcie Alt + Enter).

Thiago Pereira
źródło
18

Usuń plik .iml z całego modułu projektu, a następnie przejdź do Plik -> Unieważnij pamięć podręczną / Uruchom ponownie

Maciej
źródło
9
Usuwanie aspektów i tłumienie ostrzeżeń lub podobnych „poprawek” nie wydawało się logiczne ani inteligentne, więc dałem temu szansę. Ale nie zrobiłem tego samego ostatniego kroku. Zamiast ja usunąłem .imlplik, wybrał do powrotnego przywozu w Maven opcji w pom.xmlpliku, a zrobił ctrl + ssię zregenerować .iml. Błędy zniknęły.
ChiefTwoPencils
13

Plik -> ProjektStructure -> Moduły -> + (w środkowej kolumnie) -> Wiosna -> OK

Aleksey Samoylov
źródło
która kolumna centralna?
Kuldeep Yadav
5

Miałem ten sam problem. Rozwiązałem to, dodając aspekt Spring (File-> Project Structure) dla każdego odpowiedniego modułu, a następnie dodając pliki konfiguracyjne. W przypadku niektórych projektów (wiosna MVC) pliki konfiguracyjne były wykrywane automatycznie. Jednak w przypadku projektu jar musiałem ręcznie dodać pliki konfiguracyjne.

jbarrameda
źródło
4

Upewnij się, że masz poprawne definicje fasoli wiosennej. Czasami aplikacja działa dobrze, po prostu wyświetla błąd w IDE, sprawdź plik 'iml' projektu, jeśli masz zdefiniowany aspekt Spring.

i-bob
źródło
Sprawdź również plik application-properties.xml. Sprawdź, czy kontekst wiersza: skanowanie komponentów pakiet podstawowy = ”com.my.project” nie wyklucza pakietu usługi, do której się odwołujesz.
i-bob
Umieściłem Twój kod w pliku „bec-job.iml” mojego projektu, ale problem nadal istnieje. Nie mogę znaleźć nazwy pliku „applicationContext-interface.xml” w moim projekcie, czy możesz o tym szczegółowo opowiedzieć ?
Vainlyh
musisz umieścić @SuppressWarnings ("SpringJavaAutowiringInspection") tuż nad częścią @Autowired twojego kodu, która jest zaznaczona na czerwono. W ten sposób IntelliJIdea rozpoznaje, które ostrzeżenie usunąć.
i-bob
musisz znaleźć plik „application-properties.xml”, a nie „applicationContext-interface.xml”
i-bob
1
To @SuppressWarnings ("SpringJavaAutowiringInspection") wydaje mi się hackem, ale działa. Dzięki chłopaki.
Minras
3

Rozwiązano problem, przechodząc do File >> Project Structure >> Facets, a następnie dodając wszystkie pliki konfiguracyjne do Spring Facet. Następnie zaczął wykrywać pliki, w których znajdują się ziarna, i był w stanie rozwiązać problem. IntelliJ daje to sprawdzenie jest dość cenne i IMHO nie powinno być wyłączane.

tomcyjohn
źródło
Nie widzę wiosny jako możliwego aspektu. Jaką masz wersję Intellij?
jDub9
2

Wygląda na to, że występuje problem z widocznością - kontroler nadrzędny nie widzi komponentu, który próbujesz połączyć.

Spróbuj dodać

@ComponentScan("path to respective Component") 

do kontrolera nadrzędnego.

Eugene Karasev
źródło
2

Upewnij się, że Twój IntelliJ Idea (IDE) jest świadomy wszystkich niezbędnych konfiguracji sprężyn, względem których jest sprawdzany Twój moduł.

Możesz to sprawdzić poniżej

Plik> Struktura projektu> Moduły> [nazwa twojego projektu w prawym panelu]> Wiosna

Czasami musimy wyraźnie powiedzieć IDE, że konfiguracja sprężynowa pochodzi z zależności (jar obecny w ścieżce klas projektu)

vivekmore
źródło
1
czy to jest dostępne w edycji społeczności, czy tylko w wersji ostatecznej?
Archimedes Trajano
1

Mam ten sam problem. Mój był taki, ponieważ fasola zawierająca autowired referencję nie była komponentem Spring (był to EJB), ale otrzymała SpringBeanAutowiringInterceptor Interceptor umożliwiającą użycie autowiring. Myślę, że Intellij nie bierze tej możliwości podczas inspekcji Autowiring.

Teocali
źródło
1

Ja też miałem ten problem. Wykonanie alt+, entera następnie prośba o ponowne uruchomienie lub wyłączenie kontroli wiosennej na wywołanej linii rozwiązało problem. Wydaje się, że stało się to problemem dopiero po aktualizacji 13.4.

Jason D.
źródło
1

w moim przypadku brakowało mi napisania w web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:applicationContext.xml</param-value>
   </context-param>

aw pliku kontekstowym aplikacji:

<context:component-scan base-package=[your package name] />

po dodaniu tych tagów i uruchomieniu programu maven, aby odbudować projekt, błąd autowired w programie intellj znika, a ikona fasoli pojawia się na lewym marginesie: wprowadź opis obrazu tutaj

demian
źródło
1

Mój dotyczy nie dodawania @Repository na moim interfejsie CrudRepository, samouczek, który oglądałem, nie dodał go do STS i nie narzekał.

Rejinderi
źródło
1

Powinieneś sprawdzić, czy masz @Component, @Repository lub podobne dodane do klasy

Milos Nikolik
źródło
0

Rozwiązałem to, dodając aspekt sieciowy.

Pavel Vlasov
źródło
0
eg1:
directorSettings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 
operate:checkout 勾去掉
eg2:
1.impl class add @service
like this:
@Service
public class CityServiceImpl implements CityService{
@Autowired
private CityDao cityDao;

like this
2.dao file class add @Repository
@Repository
public interface CityDao {
zawietrzny
źródło
0

W ten sposób rozwiązałem ten problem. W IntelliJ wszystkie twoje pakiety powinny znajdować się w pakiecie podrzędnym, który jest pakietem podrzędnym main / java. Na przykład umieściłem wszystkie moje pakiety w katalogu src / main / java / com.misol.watchStore / i spring może znaleźć moje ziarna.

Mehrdad Sharifi
źródło
0

Inject Bean with @Qualifier rozwiązał problem za mnie.

Ponleu
źródło
0

Miałem podobny problem. Rozwiązałem to, odznaczając opcję „Przetwarzaj ziarna z jawnymi adnotacjami” (patrz zrzut ekranu poniżej). Ta opcja jest domyślnie włączona w systemie Linux. Teraz adnotacje @Service i @Configurations są widoczne. zrzut ekranu

Aleksander Burzec
źródło
0

trochę późno, ale mam nadzieję, że pomoże to komuś innemu.

Upewnij się, że umieszczasz @Service w klasie implementacji usługi

@Service
public class ServiceNameImpl implements ServiceName {

    @Override
    public void method(ObjectType paramName) {
        //CODE
    }

}

W ten sposób naprawiłem błąd.

Mar Villeneuve
źródło
0

Wiem, że to stare pytanie, ale nie znalazłem odpowiedzi, które rozwiązałyby ten problem, więc podam moje rozwiązanie.

Uwaga: wydawało mi się, że przyczyną problemu może być to , ale mój problem nie był związany z dwukrotnym wdrożeniem tego samego interfejsu. Używanie @Qualitiersprawiło, że mój problem zniknął, ale był to bandaż, a nie właściwe rozwiązanie, więc nie poprzestałem na tym.

TŁO

Mam za zadanie utrzymanie starego projektu, który przeszedł przez różne wersje Spring i został zaktualizowany tylko dla oddzielnych modułów, więc rzeczy wymagały co najmniej refaktoryzacji. Początkowo miałem problem z duplikatem fasoli i majstrowanie przy różnych rzeczach zmieniało problem między wydaniem OP a problemem zduplikowanej fasoli, mimo że był tylko jeden ziarno; nawigacja do duplikatów fasoli zawsze prowadziła do tej samej klasy.

PROBLEM

Problem był obecny w @Repositoryklasie, która była @Autowiredw @Serviceklasie, która również miała @ComponentScanadnotację. Zauważyłem, że miałem również sprężynę, application-config.xmlktóra robiła context:component-scanna podstawowym pakiecie, co moim zdaniem było oryginalnym podejściem w starszych wersjach Springa. Byłem w trakcie tworzenia nowego oddziału, biorąc części starego i nowszego oddziału w projekcie wsparcia, który był wykorzystywany w różnych projektach, które były rozwijane przez kilka lat i dlatego był taki mix-and-match metodologii.

PROSTE ROZWIĄZANIE

Ponieważ bardziej nowoczesne podejście do korzystania @ComponentScanbyło już zaimplementowane, po prostu usunąłem application-config.xmli problem został rozwiązany.

Darrel Holt
źródło
0

Pracowały dla mnie:

  1. Znajdź wszystkie klasy implementujące usługę (interfejs), która powoduje błąd.
  2. Oznacz każdą z tych klas adnotacją @Service, aby wskazać je jako klasy logiki biznesowej.
  3. Odbuduj projekt.
tonderaimuchada
źródło
0

Mogę się trochę spóźnić, ale po spędzeniu godzin i badaniu tego problemu.

Dowiedziałem się, że w najnowszej wersji IntelliJ 2020 @AutoWired jest opcjonalny i preferowane jest wstrzykiwanie zależności oparte na konstruktorze.

Rozwiązałem problem, po prostu usuwając adnotację @AutoWired z klasy Service and Controller i używając iniekcji zależności opartej na konstruktorze.

Ten link może pomóc.

Miłego kodowania!

Shariq Shaikh
źródło
0

Miałem ten problem tylko z jedną usługą z iniekcją zależności opartą na konstruktorze z wersją IntelliJ 2019.2.4. Pomogła mi zmiana nazwy usługi (shift + f6), a następnie odrzucenie zmian z poziomu gita.

Vodzoo
źródło