Ich habe einen einfachen Komponententest erstellt, aber IntelliJ hebt diesen fälschlicherweise rot hervor. es als Fehler kennzeichnen
Keine Bohnen?
Wie Sie unten sehen können, besteht der Test? Also muss es autowired sein?
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.
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
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.
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{
/**/
}
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");
}
}
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.
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 {
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"
.
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.)
Ich hatte ein ähnliches Problem in meiner Anwendung .. Wenn ich Anmerkungen hinzufügte, verschwand die falsche Hervorhebung.
@ContextConfiguration(classes = {...})
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 ...
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!
Alles, was Sie dafür tun müssen, ist der folgende Code:
@ComponentScan
public class PriceWatchTest{
@Autowired
private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
Ich musste nur @EnableAutoConfiguration verwenden, um dieses Problem zu beheben, jedoch hatte dieser Fehler keine funktionellen Auswirkungen.
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.
Überprüfen Sie, ob Sie die @Service-Anmerkung in Ihrer Serviceklasse verpasst haben. Dies war bei mir der Fall.
Sie können dieses Problem lösen, indem Sie @EnableAutoConfiguration in der Hauptklasse der Spring Boot-Anwendung platzieren.
Verwenden Sie @AutoConfigureMockMvc für die Testklasse.
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:
et voilà: Die Fehlermeldung ist verschwunden!
Ü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 {
...
}
Ü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:
Oder wähle Eclipse :)