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.


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.


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.


21

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

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

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


18

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


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


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.


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.


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


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.


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


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.


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.


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


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.


1

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



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

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.


0

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


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


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.


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.


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.

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!


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.