it-swarm.com.de

intellij sagt fälschlicherweise, dass keine Beans des Typs für das autowired Repository gefunden wurden

Ich habe einen einfachen Komponententest erstellt, aber IntelliJ hebt diesen fälschlicherweise rot hervor. es als Fehler kennzeichnen

Keine Bohnen?

enter image description here

Wie Sie unten sehen können, besteht der Test? Also muss es autowired sein?

enter image description here

85
Robbo_UK

Ich hatte das gleiche Problem, als ich eine Spring Boot -Anwendung mit ihrer @SpringBootApplication-Annotation erstellte. Diese Anmerkung steht für @Configuration, @EnableAutoConfiguration und @ComponentScan gemäß der spring reference .

Wie erwartet funktionierte die neue Anmerkung einwandfrei und meine Anwendung lief reibungslos, aber Intellij beschwerte sich weiterhin über unerfüllte @Autowire-Abhängigkeiten. Sobald ich @Configuration, @EnableAutoConfiguration und @ComponentScan separat verwendet habe, wurden die Fehler nicht mehr angezeigt. Es scheint, dass Intellij 14.0.3 (und höchstwahrscheinlich auch frühere Versionen) noch nicht konfiguriert ist, um die Annotation @SpringBootApplication zu erkennen.

Wenn die Fehler Sie jetzt 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.

120

Fügen Sie der Repository-Klasse die Spring-Annotation @Repository 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 der erweiterenden Klasse Repository verwenden, werden dies Konfliktseiten sein. Dann müssen Sie explizite Seiten angeben.

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

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

Als nächstes können Sie Ihr Repository ohne Fehler autowired.

@Autowired
YourRepository yourRepository;

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

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

34
mkczyk

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.

 enter image description here

20
Natix

Ich löse dieses Problem immer, indem Sie Folgendes ausführen ..Einstellungen> Inspektionen> Federkern> Code, als Sie vom Fehler zur Warnstufe wechseln

 enter image description here

13
cristianchiess

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

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

Wie bereits erwähnt, ersetzt @SpringBootApplication-Annotation @ComponentScan. Daher müssen Sie in solchen Fällen dasselbe tun: 

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

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

11
João Matos

Ich benutze Spring-Boot 2.0 und die ultimative Edition von intellij 2018.1.1, und ich hatte das gleiche Problem.

Ich habe das Problem gelöst, indem ich @EnableAutoConfiguration in der Hauptanwendungsklasse platzierte

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
8
Kareem

Das Einfügen von @Component oder @configuration in Ihre Bean-Konfigurationsdatei scheint zu funktionieren, zB: 

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

Wenn Sie keine Änderungen an Ihrem Code vornehmen möchten, nur um Ihre IDE glücklich zu machen. Ich habe es gelöst, indem ich alle Komponenten zur Spring-Facette 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 sie neu. Verwenden Sie die zuvor erstellte Gruppe als übergeordnetes Element.

 enter image description here

Solange Ihre Tests bestanden sind, sind Sie gut, drücken Sie alt + enter, indem Sie den Cursor über den Fehler bewegen, und im Untermenü des ersten Elements finden Sie Disable Inspection 

Und noch eine letzte wichtige Information - fügen Sie die ComponentScan hinzu, damit die App über die Dinge Bescheid weiß, die sie verbinden muss. Dies ist bei dieser Frage nicht relevant. Wenn jedoch kein @autowiring ausgeführt wird, ist dies wahrscheinlich Ihre Lösung.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
2
HankCa

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

@SuppressWarnings("SpringJavaAutowiringInspection")

Was Sie tun müssen, ist hinzuzufügen 

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

Da ich denke, dass Ihr AppConfiguraion.Java-Paket tiefer ist als Ihre Anmerkungskomponente (@Service, @Component ...), 

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

2
sfwn

Ich hatte ein ähnliches Problem in der Spring Boot-Anwendung. Die Anwendung verwendet Feign (HTTP-Client, der Anforderungen von annotierten Schnittstellen synthetisiert). Nachdem die Schnittstelle SomeClient mit @FeignClient versehen wurde, generiert Feign eine Laufzeit-Proxy-Klasse, die diese Schnittstelle implementiert. Wenn eine Spring-Komponente versucht, eine Bean des Typs SomeClient automatisch zu verwenden, beschwert Idea, dass keine Bean des Typs SomeClient gefunden wurde, da im Projekt keine echte Klasse vorhanden ist, und Idea lernt @FeignClient-Annotation in keiner Weise.

Lösung: Beschriftung der Schnittstelle SomeClient mit @Component. (In unserem Fall verwenden wir @FeignClient annotation nicht direkt für SomeClient, sondern verwenden stattdessen die Metaannotation @OurProjectFeignClient, die mit @FeignClient kommentiert ist, und das Hinzufügen von @Component annotation funktioniert ebenfalls.)

2

Ich hatte ein ähnliches Problem in meiner Anwendung .. Wenn ich Anmerkungen hinzufügte, verschwand die falsche Hervorhebung.

@ContextConfiguration(classes = {...})
2
K. Gol

Für mich bestand die Lösung darin, @EnableAutoConfiguration in der Application-Klasse unter dem @SpringBootApplication zu platzieren, da es überflüssig ist. Löschen Sie es und voila alle Warnungen über fehlende Bohnen sind verschwunden! Dummer Frühling ...

1

in meinem Fall befand sich das Verzeichnis, in dem ich versucht habe, @Autowired auszuführen, nicht auf der gleichen Ebene.

nach dem Einrichten auf derselben Strukturebene ist der Fehler verschwunden

hoffe es kann jemandem helfen!

1
Davel_AG

Alles, was Sie dafür tun müssen, ist der folgende Code:

@ComponentScan
public class PriceWatchTest{

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

Ich musste nur @EnableAutoConfiguration verwenden, um dieses Problem zu beheben, jedoch hatte dieser Fehler keine funktionellen Auswirkungen.

1
Smart Coder

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

Wenn Sie die @Repository-Annotation als mk321 hinzufügen, speichern Sie sie, entfernen Sie die Annotation und speichern Sie sie erneut. Dadurch wird das Problem behoben. 

1
Jensen Buck

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

1
yankae

Sie können dieses Problem lösen, indem Sie @EnableAutoConfiguration in der Hauptklasse der Spring Boot-Anwendung platzieren. 

1
Nirbhay Rana

Verwenden Sie @AutoConfigureMockMvc für die Testklasse.

0

Manchmal - in meinem Fall - 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 passiert ist :-)

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

(Zugriff über Projektstrukturmenü oder Federwerkzeugfenster ... Bearbeiten von "Spring Application Context")

Anstelle von SpringApplicationContext, das nur meine Frühlingseinstellung ExampleApplication enthält, enthält es auch die fehlende Bean:

SpringApplicationContext:

  • Beispielanwendung.Java
  • MissingBeanClass.Java

et voilà: Die Fehlermeldung ist verschwunden!

0
U.V.

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

  ...

}
0
Jöcker

Konfigurieren Sie den Anwendungskontext und alles wird in Ordnung sein.

enter image description here

0

Überraschenderweise konnte ein Feign-orientiertes Projekt, das erfolgreich mit Eclipse ausgeführt wurde, nicht in InteliJ ausgeführt werden. Als die Anwendung gestartet wurde, beschwerte sich InteliJ über den Feign-Client, den ich in die serviceImpl-Ebene einschleusen wollte und sagte: field personRestClient (mein Feign-Client) in ... erforderte eine Bean vom Typ ..., die nicht gefunden werden konnte. Überlegen Sie, ob Sie in Ihrer Konfiguration eine Bean vom Typ '....' definieren möchten.

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 "einbeziehen".
  4. Führen Sie Ihre Anwendung aus

Oder wähle Eclipse :)

0
ylev