IntelliJ IDEA zeigt Fehler bei der Verwendung der @ Autowired-Annotation von Spring an

102

IntelliJ IDEA zeigt Fehler an, wenn ich die @AutowiredAnnotation von Spring in der Klasse verwende, aber die Klasse funktioniert problemlos.

Hier ist diese Fehlermeldung:

Autowired-Mitglieder müssen in der gültigen Spring Bean (@ Component / @ Service usw.) Weniger definiert werden ... (Strg + F1) Überprüft Autowire-Probleme in einer Bean-Klasse.

Vergeblich
quelle
5
Versuchen Sie dies zu verwenden: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob
Ich habe den gleichen Fehler für meine Integrationstestklassen. Ich denke, die Verwendung der Annotation @SupressWarnings ist eine gute Lösung.
Kevin Wittek
Intellij 2016.2 macht dies mit meinem Spring Boot / Spring Data-Projekt. In welcher Datei prüft Intellij, welche Beans vorhanden sind?
Adam
2
Ich musste @SuppressWarnings ("SpringJavaAutowiredMembersInspection") verwenden
user672009
3
Für IntelliJ IDEA 2017.3.1 (Ultimate Edition) verwenden Sie@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Antworten:

31

Ich hatte das gleiche Problem mit IntelliJ IDEA 13.1.4. Ich habe es gelöst, indem ich die Federfacette (Datei-> Projektstruktur) entfernt und nur "Erkennung" angezeigt habe.

Jose Leon
quelle
36
Aber was ist, wenn Sie tatsächlich vergessen, eine Bohne mit Anmerkungen zu versehen? Sie werden keine Warnung bekommen?
Cleankod
22

Wenn Sie wissen, dass die Bean vorhanden ist und es sich nur um ein Problem der Inspektionen handelt, fügen Sie vor der Variablendeklaration Folgendes hinzu:

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

Manchmal kann IntelliJ nicht aufgelöst werden, wenn eine Bean deklariert wurde, z. B. wenn die Bean bedingt enthalten ist und die Bedingungsauflösung zur Laufzeit erfolgt.

Lanoxx
quelle
21

Ich habe es behoben, indem ich die Unterdrückungswarnung hinzugefügt habe:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....
user3580264
quelle
19

Habe hier den gleichen Fehler!

Es scheint, dass der Intellij nicht überprüfen kann, ob die Klassenimplementierung ein @Service oder eine @Component ist.

Lösen Sie es, indem Sie einfach von Fehler zu Warnung wechseln (Alt + Eingabetaste drücken).

Thiago Pereira
quelle
18

Entfernen Sie die IML-Datei aus Ihrem gesamten Projektmodul und gehen Sie als Nächstes zu Datei -> Caches ungültig machen / neu starten

Maciej
quelle
9
Das Entfernen von Facetten und das Unterdrücken von Warnungen oder ähnlichen "Korrekturen" schien weder logisch noch klug zu sein, also habe ich es versucht. Aber ich habe den letzten Schritt nicht gleich gemacht. Stattdessen löschte ich meine .imlDatei, wähle in Maven Optionen auf der zu Re - Import - pom.xmlDatei und ein tat ctrl + sdas zu regenerieren .iml. Fehler weg.
ChiefTwoPencils
13

Datei -> ProjectStructure -> Module -> + (in der mittleren Spalte) -> Spring -> OK

Aleksey Samoylov
quelle
welche zentrale Spalte?
Kuldeep Yadav
5

Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich die Spring-Facette (Datei-> Projektstruktur) für jedes relevante Modul hinzugefügt und dann die Konfigurationsdateien hinzugefügt habe. Bei einigen Projekten (spring mvc) wurden die Konfigurationsdateien automatisch erkannt. Für ein JAR-Projekt musste ich die Konfigurationsdateien jedoch manuell hinzufügen.

jbarrameda
quelle
4

Stellen Sie sicher, dass Ihre Spring Bean-Definitionen korrekt sind. Manchmal funktioniert die Anwendung einwandfrei. Sie zeigt nur einen Fehler in der IDE an. Überprüfen Sie die IML-Datei Ihres Projekts, wenn Sie eine Spring-Facette definiert haben.

i-bob
quelle
Überprüfen Sie auch Ihre application-properties.xml. Überprüfen Sie, ob der Zeilenkontext: component-scan base-package = ”com.my.project” das Paket des Dienstes, auf den Sie verweisen, nicht ausschließt.
i-bob
Ich habe Ihren Code in die "bec-job.iml" meines Projekts eingefügt, aber das Problem besteht immer noch. Und ich kann den Dateinamen "applicationContext-interface.xml" in meinem Projekt nicht finden. Können Sie dies ausführlich erläutern? ?
Vainlyh
Sie müssen @SuppressWarnings ("SpringJavaAutowiringInspection") direkt über dem @Autowired-Teil Ihres Codes platzieren, der rot hervorgehoben ist. Auf diese Weise erkennt IntelliJIdea, welche Warnung unterdrückt werden soll.
i-bob
Sie müssen die Datei "application-properties.xml" finden, nicht "applicationContext-interface.xml"
i-bob
1
Das @SuppressWarnings ("SpringJavaAutowiringInspection") scheint mir hacky, aber es funktioniert. Danke Leute.
Minras
3

Das Problem wurde behoben, indem Sie zu Datei >> Projektstruktur >> Facetten gingen und dann alle Konfigurationsdateien zu Spring Facet hinzufügten. Danach wurden Dateien erkannt, in denen sich die Beans befinden, und das Problem konnte behoben werden. IntelliJ, das diesen Scheck gibt, ist sehr wertvoll und IMHO sollte nicht deaktiviert werden.

Tomcyjohn
quelle
Ich sehe den Frühling nicht als mögliche Facette. Welche Version von Intellij haben Sie?
jDub9
2

Es scheint das Sichtbarkeitsproblem zu sein - der übergeordnete Controller sieht die Komponente, die Sie verkabeln möchten, nicht.

Versuchen Sie hinzuzufügen

@ComponentScan("path to respective Component") 

an den übergeordneten Controller.

Eugene Karasev
quelle
2

Stellen Sie sicher, dass Ihre IntelliJ Idea (IDE) alle erforderlichen Federkonfigurationen kennt, anhand derer Ihr Modul geprüft wird.

Sie können dies unter überprüfen

Datei> Projektstruktur> Module> [Ihr Projektname im rechten Bereich]> Frühling

Manchmal müssen wir der IDE explizit mitteilen, dass die Federkonfiguration von einer Abhängigkeit stammt (ein JAR, das in Ihrem Projektklassenpfad vorhanden ist).

vivekmore
quelle
1
Ist dies in der Community Edition verfügbar oder nur in der Ultimate?
Archimedes Trajano
1

Ich habe das gleiche Problem. Meins war, weil die Bean, die die automatisch verdrahtete Referenz enthielt, keine Spring-Komponente war (es war eine EJB), sondern einen SpringBeanAutowiringInterceptor Interceptor erhielt, der die Verwendung von autowiring ermöglicht. Ich denke, Intellij nutzt diese Möglichkeit bei seiner Autowiring-Inspektion nicht.

Teocali
quelle
1

Ich hatte auch dieses Problem. Durch Ausführen von alt+ enterund Aufforderung, die Federinspektion auf der betroffenen Linie entweder erneut auszuführen oder zu deaktivieren, wurde dies behoben. Dies scheint erst nach dem 13.4-Update zu einem Problem geworden zu sein.

Jason D.
quelle
1

In meinem Fall fehlte mir das Schreiben in 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>

und in der Anwendungskontextdatei:

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

Nachdem Sie diese Tags hinzugefügt und maven ausgeführt haben, um das Projekt neu zu erstellen, wird der automatisch verdrahtete Fehler in Intellj angezeigt und das Bean-Symbol wird am linken Rand angezeigt: Geben Sie hier die Bildbeschreibung ein

demian
quelle
1

Meins ist dafür gedacht, @Repository nicht zu meiner CrudRepository-Oberfläche hinzuzufügen. Das Tutorial, das ich mir angesehen habe, hat es nicht zu STS hinzugefügt und es hat sich nicht beschwert.

Rejinderi
quelle
1

Sie sollten überprüfen, ob der Klasse @Component, @Repository oder ähnliches hinzugefügt wurde

Milos Nikolik
quelle
0

Ich habe das durch Hinzufügen einer Web-Facette gelöst.

Pavel Vlasov
quelle
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 {
Lee
quelle
0

Ich habe dieses Problem auf diese Weise gelöst. In IntelliJ sollten sich alle Ihre Pakete in einem Unterpaket befinden, das das Unterpaket von main / java ist. Zum Beispiel habe ich alle meine Pakete unter src / main / java / com.misisol.watchStore / abgelegt und der Frühling konnte meine Bohnen danach finden.

Mehrdad Sharifi
quelle
0

Inject Bean mit @Qualifier hat das Problem für mich gelöst.

Ponleu
quelle
0

Ich hatte ein ähnliches Problem. Ich habe es gelöst, indem ich die Option "Explizit kommentierte Beans verarbeiten" deaktiviert habe (siehe Abbildung unten). Diese Option ist unter Linux standardmäßig aktiviert. Jetzt sind die Anmerkungen @Service und @Configurations sichtbar. Bildschirmfoto

Aleksander Burzec
quelle
0

ein bisschen spät, aber ich hoffe, es hilft jemand anderem.

Stellen Sie sicher, dass @Service in der Implementierungsklasse für den Service enthalten ist

@Service
public class ServiceNameImpl implements ServiceName {

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

}

So habe ich den Fehler behoben.

Mar Villeneuve
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber ich habe keine Antworten gefunden, die dieses Problem für mich gelöst haben, daher werde ich meine Lösung bereitstellen.

Hinweis: Ich dachte , das Problem gewesen sein mag dies , aber mein Problem wurde nicht im Zusammenhang mit der gleichen Schnittstelle zweimal implementieren. Die Verwendung @Qualitierhat mein Problem behoben, aber es war ein Verband und keine richtige Lösung, also habe ich mich damit nicht zufrieden gegeben.

HINTERGRUND

Ich habe die Aufgabe, ein altes Projekt zu pflegen, das verschiedene Versionen des Frühlings durchlaufen hat und nur für separate Module aktualisiert wurde. Daher mussten die Dinge, gelinde gesagt, überarbeitet werden. Ich hatte anfangs das Problem mit doppelten Bohnen bekommen, und das Basteln mit Dingen änderte das Problem zwischen dem Problem von OP und dem Problem mit doppelten Bohnen hin und her, obwohl es nur eine Bohne gab. Das Navigieren zu den doppelten Beans ging immer zur gleichen Klasse.

DAS THEMA

Das Problem war in einer @RepositoryKlasse vorhanden, die sich @Autowiredin einer @ServiceKlasse befand, in der auch die @ComponentScanAnmerkung enthalten war. Ich bemerkte, dass ich auch eine Feder hatte application-config.xml, die ein context:component-scanBasispaket ausführte, was meiner Meinung nach der ursprüngliche Ansatz in älteren Versionen von Spring war. Ich war dabei, eine neue Niederlassung zu gründen, indem ich Teile einer alten und einer neueren Niederlassung in ein Unterstützungsprojekt einbezog, das in verschiedenen Projekten verwendet wurde, die über mehrere Jahre hinweg entwickelt wurden, und deshalb gab es eine solche Mischung von Methoden.

EINFACHE LÖSUNG

Da der modernere Verwendungsansatz @ComponentScanbereits implementiert war, habe ich ihn einfach entfernt application-config.xmlund das Problem wurde gelöst.

Darrel Holt
quelle
0

Folgendes hat bei mir funktioniert:

  1. Suchen Sie alle Klassen, die den Dienst (die Schnittstelle) implementieren, der den Fehler ausgibt.
  2. Markieren Sie jede dieser Klassen mit der Annotation @Service, um sie als Geschäftslogikklassen anzugeben.
  3. Erstellen Sie das Projekt neu.
tonderaimuchada
quelle
0

Ich bin vielleicht etwas spät dran, aber nachdem ich Stunden damit verbracht habe, über dieses Thema zu recherchieren.

Ich fand heraus, dass in der neuesten Version IntelliJ 2020 @AutoWired optional ist und eine konstruktorbasierte Abhängigkeitsinjektion vorzuziehen ist.

Ich habe das Problem behoben, indem ich einfach die @ AutoWired Annotation aus der Service- und Controller-Klasse entfernt und eine konstruktorbasierte Abhängigkeitsinjektion verwendet habe.

Dieser Link könnte helfen.

Viel Spaß beim Codieren!

Shariq Shaikh
quelle
0

Ich hatte dieses Problem mit nur einem Dienst mit konstruktorbasierter Abhängigkeitsinjektion mit der Version 2019.2.4 von IntelliJ. Ich fand es hilfreich, den Namen des Dienstes zu ändern (Umschalt + f6) und dann die Änderungen von der Git-Ebene zu verwerfen.

Vodzoo
quelle