intellij ne dit pas correctement les beans de type trouvés pour le repository automatique

J’ai créé un test unitaire simple, mais IntelliJ le signale de manière incorrecte en rouge. le marquer comme une erreur

Pas de haricots?

entrer la description de l'image ici

Comme vous pouvez le voir ci-dessous, il passe le test? Donc, il doit être Autowired?

entrer la description de l'image ici

J’ai rencontré le même problème lors de la création d’une application Spring Boot à l’ aide de leur annotation @SpringBootApplication . Cette annotation représente @Configuration , @EnableAutoConfiguration et @ComponentScan conformément à la référence du spring .

Comme prévu, la nouvelle annotation fonctionnait correctement et mon application fonctionnait correctement, mais Intellij continuait à se @Autowire dépendances @Autowire non @Autowire . Dès que je suis revenu à utiliser @Configuration , @EnableAutoConfiguration et @ComponentScan séparément, les erreurs ont cessé. Il semble qu’Intellij 14.0.3 (et probablement aussi les versions antérieures) n’est pas encore configuré pour reconnaître l’annotation @SpringBootApplication .

Pour l’instant, si les erreurs vous dérangent beaucoup, revenez à ces trois annotations distinctes. Sinon, ignorez Intellij … votre résolution de dépendance est correctement configurée depuis votre test.

Toujours se rappeler…

L’homme est toujours plus grand que la machine.

Ajoutez une annotation Spring @Repository sur la classe de référentiel.

Je sais que cela devrait fonctionner sans cette annotation. Mais si vous ajoutez ceci, IntelliJ ne montrera pas d’erreur.

 @Repository public interface YourRepository ... ... 

Si vous utilisez Spring Data avec l’extension de la classe Repository , il y aura des conflits de conflits. Ensuite, vous devez indiquer les pagkages explicite.

 import org.springframework.data.repository.Repository; ... @org.springframework.stereotype.Repository public interface YourRepository extends Repository { ... } 

Et ensuite, vous pouvez envoyer votre référentiel sans erreur.

 @Autowired YourRepository yourRepository; 

Ce n’est probablement pas une bonne solution (je suppose que vous essayez d’enregistrer deux fois le repositorium). Mais travaille pour moi et ne montre pas d’erreurs.

Peut-être que dans la nouvelle version d’IntelliJ peut être corrigé: https://youtrack.jetbrains.com/issue/IDEA-137023

Ma version d’IntelliJ IDEA Ultimate (2016.3.4 Build 163) semble le supporter. L’astuce est que vous devez avoir activé le plugin Spring Data.

entrer la description de l'image ici

Je résous toujours ce problème en procédant comme suit: Paramètres> Inspections> Spring Core> Code que vous passez de l’erreur à l’avertissement de l’option de gravité

entrer la description de l'image ici

J’utilise Spring-Boot 2.0 et Intelli 2018.1.1 Ultimate Edition et j’ai rencontré le même problème.

J’ai résolu en plaçant @EnableAutoConfiguration dans la classe principale de l’application

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

Vous devez parfois indiquer où @ComponentScan doit rechercher les composants. Vous pouvez le faire en passant les packages en paramètre de cette annotation, par exemple:

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

Cependant, comme déjà mentionné, l’annotation @SpringBootApplication remplace @ComponentScan. Par conséquent, dans de tels cas, vous devez faire la même chose:

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

Au moins dans mon cas, Intellij a cessé de se plaindre.

Si vous ne voulez pas modifier votre code, contentez-vous de rendre votre IDE heureux. Je l’ai résolu en ajoutant tous les composants à la facette Spring.

  1. Créez un groupe avec le nom “Service, Processors and Routers” ou tout autre nom que vous voulez;
  2. Supprimez et recréez “Contexte d’application Spring” utilisez le groupe que vous avez créé précédemment en tant que parent.

entrer la description de l'image ici

Tant que vos tests vous réussissent, appuyez sur alt + enter en passant le curseur sur l’erreur et dans le sous-menu du premier élément, vous trouverez Disable Inspection sélectionnez cette option.

Mettre @Component ou @configuration dans votre fichier de configuration de bean semble fonctionner, c’est-à-dire quelque chose comme:

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

Et une dernière information importante: ajoutez ComponentScan pour que l’application sache tout ce qu’il doit câbler. Ceci n’est pas pertinent dans le cas de cette question. Cependant, si aucun @autowiring n’est exécuté, c’est probablement votre solution.

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

Ce que vous devez faire est d’append

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

Puisque je pense que le AppConfiguraion.java votre AppConfiguraion.java est plus profond que votre composant d’annotation (package @Service, @Component …),

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

J’ai eu un problème similaire dans mon application. Lorsque j’ai ajouté des annotations, une mise en évidence incorrecte a disparu.

 @ContextConfiguration(classes = {...}) 

J’ai eu un problème similaire dans l’application Spring Boot. L’application utilise Feign (requêtes de synthèse de clients HTTP à partir d’interfaces annotées). Avec l’interface SomeClient annotée avec @FeignClient , Feign génère une classe proxy d’exécution implémentant cette interface. Quand un composant Spring essaie de générer automatiquement un bean de type SomeClient , Idea ne se plaint d’aucun bean de type SomeClient car aucune classe réelle n’existe réellement dans le projet et Idea ne comprend aucune manière les annotations @FeignClient .

Solution: annoter l’interface SomeClient avec @Component . (Dans notre cas, nous n’utilisons pas l’annotation SomeClient directement sur SomeClient , nous utilisons plutôt la métaannotation @OurProjectFeignClient qui est annotée @FeignClient et l’ajoute à l’annotation @Component .)

Cela semble toujours être un bogue dans le dernier IntelliJ et a trait à un problème de mise en cache possible?

Si vous ajoutez l’annotation @Repository comme mk321 mentionnée ci-dessus, enregistrez, puis supprimez l’annotation et enregistrez à nouveau, cela résout le problème.

J’utilise cette annotation pour masquer cette erreur lorsqu’elle apparaît dans IntelliJ v.14:

 @SuppressWarnings("SpringJavaAutowiringInspection") 

Tout ce que vous devez faire pour que ce travail soit le code suivant:

 @ComponentScan public class PriceWatchTest{ @Autowired private PriceWatchJpaRepository priceWatchJpaRepository; ... ... } 

Ma solution à ce problème dans mon application de démarrage printanier consistait à ouvrir le contexte de l’application Spring et à append manuellement la classe du bean autowired manquant!

(access via le menu de la structure du projet ou la fenêtre de l’outil Spring … edit “Spring Application Context”)

Donc, au lieu de SpringApplicationContext contenant juste ma configuration de spring ExampleApplication, il contient également le bean manquant:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: le message d’erreur a disparu!

Parfois, dans mon cas, la raison en est une mauvaise importation. J’ai accidentellement importé

 import org.jvnet.hk2.annotations.Service 

au lieu de

 import org.springframework.stereotype.Service 

en acceptant aveuglément le premier choix dans les importations suggérées par Idea. Il m’a fallu quelques minutes la première fois que ça arrivait 🙂

J’ai également rencontré ce problème et l’ai résolu en supprimant la Spring Facet:

  • Fichier -> Structure du projet
  • Sélectionner les Facets
  • Supprimer le spring

Bonne chance!