Intellij sagt fälschlicherweise, dass keine Beans vom Typ für das automatisch verdrahtete Repository gefunden wurden

138

Ich habe einen einfachen Komponententest erstellt, aber IntelliJ hebt ihn fälschlicherweise rot hervor. Markieren Sie es als Fehler

Keine Bohnen?

Geben Sie hier die Bildbeschreibung ein

Wie Sie unten sehen können, besteht es den Test? Also muss es Autowired sein?

Geben Sie hier die Bildbeschreibung ein

Robbo_UK
quelle
3
IntelliJ gibt manchmal falsch positive Autodrahtfehler aus. Zum Beispiel in Spring Boot-Anwendungen, in denen ein Großteil der Konfiguration hinter EnableAutoConfiguration verborgen ist. Dafür gibt es ein offenes Thema. Eine andere Ursache ist möglicherweise eine falsch konfigurierte Federfacette. Was ich normalerweise in diesen Situationen mache, ist die Verringerung des Inspektionsschweregrads, damit es weniger aufdringlich ist ...
Bohuslav Burghardt

Antworten:

176

Ich hatte das gleiche Problem beim Erstellen einer Spring Boot- Anwendung mit ihren @SpringBootApplicationAnmerkungen. Diese Anmerkung darstellt @Configuration, @EnableAutoConfigurationund @ComponentScanentsprechend der Federreferenz .

Wie erwartet funktionierte die neue Anmerkung ordnungsgemäß und meine Anwendung lief reibungslos, aber Intellij beschwerte sich weiterhin über unerfüllte @AutowireAbhängigkeiten. Sobald ich wieder zu verwenden geändert @Configuration, @EnableAutoConfigurationund @ComponentScangetrennt, hörten die Fehler. Es scheint, dass Intellij 14.0.3 (und höchstwahrscheinlich auch frühere Versionen) noch nicht so konfiguriert ist, dass die @SpringBootApplicationAnmerkung erkannt wird .

Wenn Sie die Fehler vorerst so sehr stören, kehren Sie zu diesen drei separaten Anmerkungen zurück. Andernfalls ignorieren Sie Intellij ... Ihre Abhängigkeitsauflösung ist korrekt konfiguriert, da Ihr Test erfolgreich ist.

Immer daran denken...

Der Mensch ist immer größer als die Maschine.

Abimbola Esuruoso
quelle
1
Das Problem wurde jetzt mit neueren Versionen von Intellij behoben (überprüft am 2017.1)
Sourabh
44
Ich bekomme es immer noch mit 2017.2 und es ist die bezahlte Lizenz.
Thomas Carlisle
1
Ich erhalte es mit 2017.2 und SprintBootTest Outer Class und SpringBootApplication Static Inner Class gemäß Spring Cloud Stream- Testbeispiel
danebez
4
Für neuere Versionen von IntelliJ (z. B. 2017) müssen Sie das Spring Data-Plugin aktivieren, und dann benötigen Sie keine der oben genannten Problemumgehungen. Unten finden Sie eine weitere Antwort, die Ihnen sagt, wie das geht.
Norbert
4
Bei IntelliJ 2018.2 mit Spring Boot 2.0.5 @SpringBootApplicationwurde dieser Fehler angezeigt . Ich folgte dem Rat von @ Jaõs Matos, indem ich den scanBasePackagesParameter für @SpringBootApplicationdas Paket / die Namespaces verwendete und diese spezifizierte, die gescannt werden sollten.
Dave Goodchild
53

Fügen @RepositorySie der Repository-Klasse eine Spring-Annotation hinzu .

Ich weiß, dass es ohne diese Anmerkung funktionieren sollte. Wenn Sie dies hinzufügen, zeigt IntelliJ keinen Fehler an.

@Repository
public interface YourRepository ...
...

Wenn Sie Spring Data mit erweiterter RepositoryKlasse verwenden, handelt es sich um Konfliktseiten. Dann müssen Sie explizite Seiten angeben.

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

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

Und als nächstes können Sie Ihr Repository ohne Fehler automatisch verdrahten.

@Autowired
YourRepository yourRepository;

Es ist wahrscheinlich keine gute Lösung (ich denke, Sie versuchen zweimal, das Repositorium zu registrieren). Aber arbeite für mich und zeige keine Fehler.

Möglicherweise kann in der neuen Version von IntelliJ behoben werden: https://youtrack.jetbrains.com/issue/IDEA-137023

mkczyk
quelle
3
Laut diesem youtrack.jetbrains.com/issue/IDEA-148113 ist es in Version 16 behoben ... (hält den Atem an)
ismoore999
@Component scheint auch zu funktionieren. Sieht so aus, als müsste man nur das Scannen der Schnittstelle / Klasse erzwingen
Brett
Sie müssen @Repository nicht mehr hinzufügen. Nur auf Spring Data Plugin.
Shin Kim
3
Drei Jahre später und es ist wieder kaputt
GaryM
Ich habe / @ Mapper für meine Mapper-Oberfläche (mybatis) verwendet. IDEE werfen diese Warnung. Ich habe es in / @ Repository geändert, die Warnung ist weg.
Bzuo
32

Meine Version von IntelliJ IDEA Ultimate (2016.3.4 Build 163) scheint dies zu unterstützen. Der Trick ist, dass Sie das Spring Data-Plugin aktiviert haben müssen.

Geben Sie hier die Bildbeschreibung ein

Natix
quelle
Dies hat das Problem auch für mich behoben - es scheint, dass dies das eigentliche Problem für jeden sein kann, der ansonsten seinen Code korrekt eingerichtet hat!
Matsu Q.
5
Funktioniert nicht in 2017.2.7. Plugin ist aktiviert, aber die Warnung ist weiterhin vorhanden.
Brainfrozen
Arbeitete für mich in iJ Ultimate 2018.2.5.
JL_SO
23

Manchmal müssen Sie angeben, wo @ComponentScan nach Komponenten suchen soll. Sie können dies tun, indem Sie die Pakete als Parameter dieser Anmerkung übergeben, z.

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

Wie bereits erwähnt, ersetzt die Annotation @SpringBootApplication @ComponentScan. In solchen Fällen müssen Sie daher dasselbe tun:

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

Zumindest in meinem Fall hörte Intellij auf, sich zu beschweren.

João Matos
quelle
2
Dies ist definitiv die bessere, sauberere Lösung und kann bestätigen, dass dadurch die Warnung entfernt wurde. Vielen Dank!
Dave Goodchild
2
In meinem Fall hatte ich @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) und obwohl die App gut funktionierte, mochte Intellij es nicht. Wechsel zu @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})für mich behoben!
GriffoGoes
1
Dies ist bei weitem die beste Lösung, da sie zwischen IDEs portierbar ist und die Entwicklerabsicht klar kommuniziert.
MusikPolice
Ich verwende Ultimate 2019.3.1 Spring Boot 2.2.1 und Java 11.0.4. Das Problem besteht weiterhin in Unit-Test-Dateien.
GaryM
1
Was @GriffoGoes vorgeschlagen hat, hat mein Problem behoben, da ich eine Multi-Modul-Struktur verwendet habe. Das war meine beste Lösung
Juan Monsalve,
20

Ich löse dieses Problem immer, indem ich Folgendes tue: Einstellungen> Inspektionen> Spring Core> Code, als Sie vom Fehler zur Warnung der Schweregradoption wechseln

Geben Sie hier die Bildbeschreibung ein

cristianchiess
quelle
2
Ich habe mich für diese Lösung entschieden, bis im Frühjahr eine Lösung gefunden wurde: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley
15

Ich verwende Spring-Boot 2.0 und Intellij 2018.1.1 Ultimate Edition und hatte das gleiche Problem.

Ich habe das Problem gelöst, indem ich @EnableAutoConfiguration in die Hauptanwendungsklasse eingefügt habe

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
quelle
13
Dies "funktioniert" auch für mich, aber dann beschwert sich Intellij: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Überprüfen Sie, ob Sie die @ Service-Annotation in Ihrer Serviceklasse verpasst haben. Dies war bei mir der Fall.

Yankae
quelle
5

Das Einfügen @Componentoder Einfügen @configurationin Ihre Bean-Konfigurationsdatei scheint zu funktionieren, dh wie folgt:

@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");
    }
}
wired00
quelle
4

Wenn Sie keine Änderungen an Ihrem Code vornehmen möchten, um Ihre IDE glücklich zu machen. Ich habe es gelöst, indem ich alle Komponenten zur Federfacette hinzugefügt habe.

  1. Erstellen Sie eine Gruppe mit dem Namen "Service, Prozessoren und Router" oder einem beliebigen Namen.
  2. Entfernen Sie "Spring Application Context" und erstellen Sie es neu. Verwenden Sie die Gruppe, die Sie zuvor als übergeordnetes Element erstellt haben.

Geben Sie hier die Bildbeschreibung ein

Xiao Peng - ZenUML.com
quelle
4

Solange Ihre Tests bestanden sind, sind Sie gut. Bewegen Sie alt + enterden Mauszeiger über den Fehler und Disable Inspectionwählen Sie diesen im Untermenü des ersten Elements aus

imal hasaranga perera
quelle
Vielen Dank. Gibt es übrigens eine Möglichkeit, alle vorgenommenen Änderungen, die nicht standardmäßig sind, in einer Ansicht in den IntelliJ-Einstellungen anzuzeigen (damit Sie wissen, was Sie geändert haben)?
Pulver366
3

Ich hatte ein ähnliches Problem in der Spring Boot-Anwendung. Die Anwendung verwendet Feign (HTTP-Client-Synthetisierungsanforderungen von kommentierten Schnittstellen). Nachdem die Schnittstelle mit SomeClientAnmerkungen versehen wurde @FeignClient, generiert Feign eine Laufzeit-Proxy-Klasse, die diese Schnittstelle implementiert. Wenn eine Spring-Komponente versucht, eine Bean vom Typ automatisch zu verdrahten SomeClient, beschwert sich Idea darüber, dass keine Bean vom Typ SomeClientgefunden wurde, da im Projekt tatsächlich keine echte Klasse vorhanden ist und Idea nicht das Verstehen beigebracht wird@FeignClient Anmerkungen in irgendeiner Weise .

Lösung: Schnittstelle SomeClientmit kommentieren @Component. (In unserem Fall verwenden wir @FeignClientAnnotation nicht SomeClientdirekt, sondern Metaannotation, @OurProjectFeignClientdie @FeignClientmit @ComponentAnnotationen versehen ist, und das Hinzufügen von Annotationen funktioniert ebenfalls.)

Tomáš Záluský
quelle
Ja, das Hinzufügen @Componentzur Schnittstelle löst das Problem. Aber ich denke, das ist nicht der richtige Weg ... Meiner Meinung nach ist dies ein Fehler in IntelliJ IDEA oder nicht so schwer zu sein IntelliJ IDEA ist nicht bereit für neuere Feign-Versionen. Es funktioniert ohne @Componentin früheren Versionen (wo die @FeignClientAnnotation org.springframework.cloud.netflix.feignstatt war org.springframework.cloud.openfeign- vielleicht ist dies die Ursache des Problems?). Haben Sie weitere Details (möglicherweise ein Bug-Ticket) dafür gefunden?
Josef Reichardt
Nein, habe ich nicht, obwohl mein Fall (der ohne nicht funktioniert hat @Component) @FeignClientaus dem org.springframework.cloud.netflix.feignPaket stammt.
Tomáš Záluský
3
Problem
Josef Reichardt
3

Konfigurieren Sie den Anwendungskontext und alles wird in Ordnung sein.

Geben Sie hier die Bildbeschreibung ein

Arayik Harutyunyan
quelle
2

Und noch eine letzte wichtige Information: Fügen Sie die hinzu, ComponentScandamit die App über die Dinge Bescheid weiß, die sie verkabeln muss. Dies ist bei dieser Frage nicht relevant. Wenn jedoch überhaupt keine durchgeführt @autowiringwird, ist dies wahrscheinlich Ihre Lösung.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
quelle
Das macht Sinn und hat den Trick für mich getan. Warum Warnungen ausschalten? Die Warnungen sollten wie erwartet funktionieren!
WebComer
2

Was Sie tun müssen, ist hinzufügen

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

Da ich denke, dass Ihr AppConfiguraion.javaPaket tiefer ist als das Paket Ihrer Anmerkungskomponente (@Service, @Component ...),

wie "package/include/your/annotation/component/deeper/config".

sfwn
quelle
@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov
2

Ich hatte ein ähnliches Problem in meiner Bewerbung. Als ich Anmerkungen hinzufügte, verschwand falsches Highliting.

@ContextConfiguration(classes = {...})
K. Gol
quelle
nur für Testpakete!
Iakov Senatov
2

Ich verwende diese Anmerkung, um diesen Fehler auszublenden, wenn er in IntelliJ v.14 angezeigt wird:

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
quelle
Wenn es automatisch in einen Konstruktor verdrahtet wird, ist es@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren
2

Für mich bestand die Lösung darin, sie @EnableAutoConfigurationin die Anwendungsklasse @SpringBootApplicationzu stellen, um sie zu unterstreichen, weil sie redundant ist. Löschen Sie es und voila alle Ihre Warnungen bezüglich fehlender Bohnen sind verschwunden! Dumme Frühling ...

Farkas Archie Bako
quelle
2

In meinem Fall war das Verzeichnis, das ich @Autowired verwenden wollte, nicht auf derselben Ebene.

Nach dem Einrichten auf derselben Strukturebene verschwand der Fehler

hoffe es kann jemandem helfen!

Davel_AG
quelle
1

Meine Lösung für dieses Problem in meiner Spring-Boot-Anwendung bestand darin, den Spring-Anwendungskontext zu öffnen und die Klasse für die fehlende automatisch verdrahtete Bean manuell hinzuzufügen!

(Zugriff über das Projektstrukturmenü oder das Spring Tool-Fenster ... bearbeiten Sie den "Spring Application Context")

Anstelle von SpringApplicationContext, der nur meine ExampleApplication-Federkonfiguration enthält, enthält es auch die fehlende Bean:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: Die Fehlermeldung ist verschwunden!

UV
quelle
1

Dies scheint immer noch ein Fehler im neuesten IntelliJ zu sein und hat mit einem möglichen Caching-Problem zu tun?

Wenn Sie die Annotation @Repository wie oben erwähnt als mk321 hinzufügen, speichern, entfernen Sie die Annotation und speichern Sie sie erneut. Dadurch wird das Problem behoben.

Jensen Buck
quelle
1

Alles, was Sie tun müssen, damit dies funktioniert, ist der folgende Code:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
olammy
quelle
1

Ich musste nur @EnableAutoConfiguration verwenden, um das Problem zu beheben. Dieser Fehler hatte jedoch keine funktionalen Auswirkungen.

Smart Coder
quelle
1

Dies kann gelöst werden, indem @EnableAutoConfiguration in der Hauptklasse der Spring-Boot-Anwendung platziert wird.

Nirbhay Rana
quelle
0

Manchmal - in meinem Fall also - ist der Grund ein falscher Import. Ich habe versehentlich importiert

import org.jvnet.hk2.annotations.Service

anstatt

import org.springframework.stereotype.Service

indem Sie blind die erste Wahl in den von Idea vorgeschlagenen Importen akzeptieren. Ich habe ein paar Minuten gebraucht, als es das erste Mal passierte :-)

Christoph Grimmer-Dietrich
quelle
0

Überraschenderweise konnte ein Feign-orientiertes Projekt, das erfolgreich mit Eclipse ausgeführt wurde, nicht in InteliJ ausgeführt werden. Beim Starten der Anwendung beschwerte sich InteliJ über den Feign-Client, den ich in die serviceImpl-Ebene einfügen wollte, und sagte: Das Feld personRestClient (mein Feign-Client) in ... erforderte eine Bean vom Typ ..., die nicht gefunden werden konnte. Erwägen Sie, in Ihrer Konfiguration eine Bean vom Typ '....' zu definieren.

Ich habe lange versucht zu verstehen, was los ist. Ich habe eine Lösung (für InteliJ) gefunden, die ich nicht ganz verstehe:

  1. Alt Shift F10 (oder Menü ausführen)
  2. Wählen Sie "Konfiguration bearbeiten".
  3. Aktivieren Sie im Konfigurationsfenster das Kontrollkästchen "Abhängigkeiten mit dem Bereich" Bereitgestellt "einschließen".
  4. Führen Sie Ihre Anwendung aus

Oder wählen Sie Eclipse :)

ylev
quelle
0

Überprüfen Sie, ob das Paket Ihrer Bohne richtig geschrieben ist

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


import ...

@Service
class ServiceX {

  ...

}
Jöcker
quelle
0

Verwenden Sie @AutoConfigureMockMvc für die Testklasse.

Harshad Thombare
quelle
0

Ich habe das Problem durch die Installation des mybatis-Plugins in IDEA gelöst. Als ich das Mybatis Plugin installiert habe, ist es verschwunden.

Snkpty
quelle
0

Einfach müssen Sie 2 Schritte machen

  1. Hinzufügen der Abhängigkeit vom Ruhezustand
  2. Ändern Sie @Autowired in @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
quelle
Erkläre deine Antwort.
Mentallurg
0

IntelliJ IDEA Ultimate

Fügen Sie Ihre Hauptklasse zum IntelliJ Spring-Anwendungskontext hinzu, z. B. Application.java

File -> Project Structure..

linke Seite: Projekteinstellung -> Module

rechte Seite: Finden Sie in Ihrer Paketstruktur Springund fügen Sie hinzu+ Application.java

Anton Bondarenko
quelle
Es ist gleich UV-Antwort
Anton Bondarenko