Ich habe einen einfachen Komponententest erstellt, aber IntelliJ hebt ihn fälschlicherweise rot hervor. Markieren Sie es als Fehler
Keine Bohnen?
Wie Sie unten sehen können, besteht es den Test? Also muss es Autowired sein?
Ich habe einen einfachen Komponententest erstellt, aber IntelliJ hebt ihn fälschlicherweise rot hervor. Markieren Sie es als Fehler
Keine Bohnen?
Wie Sie unten sehen können, besteht es den Test? Also muss es Autowired sein?
Antworten:
Ich hatte das gleiche Problem beim Erstellen einer Spring Boot- Anwendung mit ihren @SpringBootApplication
Anmerkungen. Diese Anmerkung darstellt @Configuration
, @EnableAutoConfiguration
und @ComponentScan
entsprechend der Federreferenz .
Wie erwartet funktionierte die neue Anmerkung ordnungsgemäß und meine Anwendung lief reibungslos, aber Intellij beschwerte sich weiterhin über unerfüllte @Autowire
Abhängigkeiten. Sobald ich wieder zu verwenden geändert @Configuration
, @EnableAutoConfiguration
und @ComponentScan
getrennt, 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 @SpringBootApplication
Anmerkung 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.
@SpringBootApplication
wurde dieser Fehler angezeigt . Ich folgte dem Rat von @ Jaõs Matos, indem ich den scanBasePackages
Parameter für @SpringBootApplication
das Paket / die Namespaces verwendete und diese spezifizierte, die gescannt werden sollten.
Fügen @Repository
Sie 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 Repository
Klasse 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
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.
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.
@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!
Ich löse dieses Problem immer, indem ich Folgendes tue: Einstellungen> Inspektionen> Spring Core> Code, als Sie vom Fehler zur Warnung der Schweregradoption wechseln
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{
/**/
}
Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration
¯ \ _ (ツ) _ / ¯
Das Einfügen @Component
oder Einfügen @configuration
in 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");
}
}
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.
Solange Ihre Tests bestanden sind, sind Sie gut. Bewegen Sie alt + enter
den Mauszeiger über den Fehler und Disable Inspection
wählen Sie diesen im Untermenü des ersten Elements aus
Ich hatte ein ähnliches Problem in der Spring Boot-Anwendung. Die Anwendung verwendet Feign (HTTP-Client-Synthetisierungsanforderungen von kommentierten Schnittstellen). Nachdem die Schnittstelle mit SomeClient
Anmerkungen 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 SomeClient
gefunden 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 SomeClient
mit kommentieren @Component
. (In unserem Fall verwenden wir @FeignClient
Annotation nicht SomeClient
direkt, sondern Metaannotation, @OurProjectFeignClient
die @FeignClient
mit @Component
Annotationen versehen ist, und das Hinzufügen von Annotationen funktioniert ebenfalls.)
@Component
zur 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 @Component
in früheren Versionen (wo die @FeignClient
Annotation org.springframework.cloud.netflix.feign
statt war org.springframework.cloud.openfeign
- vielleicht ist dies die Ursache des Problems?). Haben Sie weitere Details (möglicherweise ein Bug-Ticket) dafür gefunden?
@Component
) @FeignClient
aus dem org.springframework.cloud.netflix.feign
Paket stammt.
Und noch eine letzte wichtige Information: Fügen Sie die hinzu, ComponentScan
damit die App über die Dinge Bescheid weiß, die sie verkabeln muss. Dies ist bei dieser Frage nicht relevant. Wenn jedoch überhaupt keine durchgeführt @autowiring
wird, ist dies wahrscheinlich Ihre Lösung.
@Configuration
@ComponentScan(basePackages = {
"some_package",
})
public class someService {
Was Sie tun müssen, ist hinzufügen
@ComponentScan("package/include/your/annotation/component")
in AppConfiguration.java
.
Da ich denke, dass Ihr AppConfiguraion.java
Paket tiefer ist als das Paket Ihrer Anmerkungskomponente (@Service, @Component ...),
wie "package/include/your/annotation/component/deeper/config"
.
Ich hatte ein ähnliches Problem in meiner Bewerbung. Als ich Anmerkungen hinzufügte, verschwand falsches Highliting.
@ContextConfiguration(classes = {...})
Ich verwende diese Anmerkung, um diesen Fehler auszublenden, wenn er in IntelliJ v.14 angezeigt wird:
@SuppressWarnings("SpringJavaAutowiringInspection")
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Für mich bestand die Lösung darin, sie @EnableAutoConfiguration
in die Anwendungsklasse @SpringBootApplication
zu 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 ...
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:
et voilà: Die Fehlermeldung ist verschwunden!
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.
Ich musste nur @EnableAutoConfiguration verwenden, um das Problem zu beheben. Dieser Fehler hatte jedoch keine funktionalen Auswirkungen.
Dies kann gelöst werden, indem @EnableAutoConfiguration in der Hauptklasse der Spring-Boot-Anwendung platziert wird.
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 :-)
Ü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:
Oder wählen Sie Eclipse :)
Verwenden Sie @AutoConfigureMockMvc für die Testklasse.
Einfach müssen Sie 2 Schritte machen
==>> change @Autowired to @Resource
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
Spring
und fügen Sie hinzu+
Application.java