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.


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”.


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.


21

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

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....

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).


18

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


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


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.


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.


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.


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.


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)


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.


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.


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


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ł.




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 {

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.



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


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.


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.


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.

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!


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.