intellij disant incorrectement aucun haricot de type trouvé pour le référentiel auto-câblé

138

J'ai créé un test unitaire simple mais IntelliJ le met incorrectement en surbrillance rouge. le marquer comme une erreur

Pas de haricots?

entrez la description de l'image ici

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

entrez la description de l'image ici

Robbo_UK
la source
3
IntelliJ donne parfois des erreurs de câblage automatique faussement positives. Par exemple dans les applications Spring Boot où une grande partie de la configuration est cachée derrière EnableAutoConfiguration. Il y a un problème ouvert pour cela. Une autre cause peut être une facette Spring mal configurée. Ce que je fais habituellement dans ces situations, c'est de réduire la gravité de l'inspection pour qu'elle soit moins gênante ...
Bohuslav Burghardt

Réponses:

177

J'ai eu ce même problème lors de la création d'une application Spring Boot en utilisant leur @SpringBootApplicationannotation. Cette annotation représente @Configuration, @EnableAutoConfigurationet @ComponentScanselon la référence du ressort .

Comme prévu, la nouvelle annotation fonctionnait correctement et mon application fonctionnait bien, mais Intellij n'arrêtait pas de se plaindre des @Autowiredépendances non remplies . Dès que je suis revenu à l'utilisation @Configuration, @EnableAutoConfigurationet @ComponentScanséparément, les erreurs ont cessé. Il semble qu'Intellij 14.0.3 (et très probablement les versions antérieures aussi) ne soit pas encore configuré pour reconnaître l' @SpringBootApplicationannotation.

Pour l'instant, si les erreurs vous dérangent autant, revenez à ces trois annotations distinctes. Sinon, ignorez Intellij ... votre résolution de dépendance est correctement configurée, car votre test réussit.

Toujours se rappeler...

L'homme est toujours plus grand que la machine.

Abimbola Esuruoso
la source
1
Le problème est maintenant résolu avec les nouvelles versions d'Intellij (vérifié sur 2017.1)
Sourabh
45
Je l'obtiens toujours avec 2017.2, et c'est la licence ultime payée.
Thomas Carlisle
1
Je l'obtiens avec la classe externe 2017.2 et SprintBootTest et la classe interne statique SpringBootApplication selon l'exemple de test Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez
4
Pour les versions plus récentes d'IntelliJ (par exemple 2017), vous devez activer le plugin Spring Data et vous n'avez besoin d'aucune des solutions de contournement ci-dessus. Il y a une autre réponse ci-dessous qui vous explique comment faire cela.
Norbert
4
Avec IntelliJ 2018.2, en utilisant Spring Boot 2.0.5 et @SpringBootApplication je cette erreur. J'ai suivi les conseils de @ Jaõs Matos en utilisant le scanBasePackagesparamètre to @SpringBootApplicationet j'ai spécifié le package / les espaces de noms à analyser.
Dave Goodchild
53

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

Je sais que cela devrait fonctionner sans cette annotation. Mais si vous ajoutez cela, IntelliJ n'affichera pas d'erreur.

@Repository
public interface YourRepository ...
...

Si vous utilisez Spring Data avec une Repositoryclasse d' extension , ce sera des pagkages de conflit. Ensuite, vous devez indiquer les pagkages d'explicité.

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

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

Et ensuite, vous pouvez configurer automatiquement 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 travaillez pour moi et ne montrez pas d'erreurs.

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

mkczyk
la source
3
Selon ce youtrack.jetbrains.com/issue/IDEA-148113, il est corrigé dans la version 16 ... (retient son souffle)
ismoore999
@Component semble également fonctionner. On dirait qu'il suffit de forcer l'interface / la classe à être analysée
Brett
Vous n'avez plus besoin d'ajouter @Repository. Juste sur le plugin Spring Data.
Shin Kim
3
Trois ans plus tard et il est à nouveau cassé
garyM
J'ai utilisé / @ Mapper pour mon interface de mappage (mybatis). IDEA jette cet avertissement. Je l'ai changé en / @ Repository, l'avertissement est parti.
bzuo
32

Ma version d'IntelliJ IDEA Ultimate (2016.3.4 Build 163) semble prendre en charge cela. L'astuce est que vous devez avoir activé le plugin Spring Data.

entrez la description de l'image ici

Natix
la source
Cela a également résolu le problème pour moi - Il semble que cela puisse être le vrai problème pour quiconque a configuré correctement son code!
Matsu Q.26
5
Ne fonctionne pas en 2017.2.7. Le plug-in est activé, mais l'avertissement est toujours présent.
brainfrozen
A travaillé pour moi dans iJ Ultimate 2018.2.5.
JL_SO
23

Parfois, vous devez indiquer où @ComponentScan doit rechercher les composants. Vous pouvez le faire en passant les packages comme 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 de même:

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

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

João Matos
la source
2
C'est certainement la meilleure solution, plus propre, et cela peut confirmer que cela a supprimé l'avertissement. Merci!
Dave Goodchild
2
Dans mon cas, je l'ai fait @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) et même si l'application fonctionnait bien, intellij ne l'aimait pas. Changer pour @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})fixe pour moi!
GriffoGoes
1
C'est de loin la meilleure solution, car elle est portable entre les IDE et communique clairement l'intention du développeur.
MusikPolice
J'utilise Ultimate 2019.3.1 Spring Boot 2.2.1 et Java 11.0.4. Le problème existe toujours dans les fichiers de test unitaire.
garyM
1
ce que @GriffoGoes a suggéré a corrigé mon problème, puisque j'utilisais une structure multi-modules, c'était ma meilleure solution
Juan Monsalve le
20

Je résous toujours ce problème en suivant .. Paramètres> Inspections> Spring Core> Code que vous passez de l'erreur à l'avertissement de l'option de gravité

entrez la description de l'image ici

Cristianchiess
la source
2
Je suis allé avec cette solution jusqu'à ce qu'un correctif soit fait sur Spring: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley
15

J'utilise spring-boot 2.0 et intellij 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 d'application principale

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
la source
13
Cela "fonctionne" aussi pour moi, mais alors intellij se plaint: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Vérifiez si vous avez manqué l'annotation @Service dans votre classe de service, c'était le cas pour moi.

yankae
la source
5

Mettre @Componentou @configurationdans 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");
    }
}
filaire00
la source
4

Si vous ne voulez apporter aucune modification à votre code, juste pour 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, Processeurs et Routeurs" ou n'importe quel nom que vous aimez;
  2. Supprimez et recréez "Spring Application Context" en utilisant le groupe que vous avez créé précédemment en tant que parent.

entrez la description de l'image ici

Xiao Peng - ZenUML.com
la source
4

Tant que vos tests réussissent, vous êtes bon, appuyez sur alt + enteren prenant le curseur sur l'erreur et à l'intérieur du sous-menu du premier élément, vous trouverez Disable Inspectionsélectionnez cela

imal hasaranga perera
la source
Merci. À propos, existe-t-il un moyen de voir toutes les modifications apportées qui ne sont pas par défaut dans une vue dans les paramètres IntelliJ (vous savez donc ce que vous avez changé)?
poudre366
3

J'ai eu un problème similaire dans l'application Spring Boot. L'application utilise Feign (client HTTP synthétisant les requêtes des interfaces annotées). L'interface étant SomeClientannotée avec @FeignClient, Feign génère une classe de proxy d'exécution implémentant cette interface. Lorsqu'un composant Spring essaie de faire passer automatiquement un bean de type SomeClient, Idea se plaint qu'aucun bean de type SomeClientn'a été trouvé car aucune classe réelle n'existe réellement dans le projet et Idea n'est pas enseigné à comprendre@FeignClient annotation.

Solution: annoter l'interface SomeClientavec @Component. (Dans notre cas, nous n'utilisons pas d' @FeignClientannotation SomeClientdirectement, nous utilisons plutôt la méta-annotation @OurProjectFeignClientqui est annotée @FeignClientet l'ajout d' @Componentannotation fonctionne également.)

Tomáš Záluský
la source
Oui, l'ajout @Componentà l'interface résout le problème. Mais je pense que ce n'est pas la bonne façon ... À mon avis, c'est un bogue dans IntelliJ IDEA ou pour être pas si difficile IntelliJ IDEA n'est pas prêt pour les nouvelles versions de Feign. Cela fonctionne sans @Componentdans les versions fictives précédentes (où se trouvait l' @FeignClientannotation au org.springframework.cloud.netflix.feignlieu de org.springframework.cloud.openfeign- c'est peut-être la cause du problème?). Avez-vous trouvé d'autres détails (peut-être un ticket de bogue) à ce sujet?
Josef Reichardt le
Non, je ne l'ai pas fait, bien que mon cas (qui n'a pas fonctionné sans @Component) soit @FeignClientde org.springframework.cloud.netflix.feign) package.
Tomáš Záluský
3
Le problème à JetBrains bug tracker est ici: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt
3

Configurez le contexte de l'application et tout ira bien.

entrez la description de l'image ici

Arayik Harutyunyan
la source
2

Et une dernière information importante - ajoutez le ComponentScanpour que l'application sache ce qu'elle doit câbler. Cela n'est pas pertinent dans le cas de cette question. Cependant, si aucun @autowiringn'est en cours, c'est probablement votre solution.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
la source
Cela a du sens et a fait l'affaire pour moi. Pourquoi désactiver les avertissements? Les avertissements devraient fonctionner comme prévu!
WebComer
2

Ce que vous devez faire est d'ajouter

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

Puisque je pense que AppConfiguraion.javale paquet de votre est plus profond que le paquet de votre composant d'annotation (@Service, @Component ...),

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

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

J'ai eu un problème similaire dans mon application. Lorsque j'ai ajouté des annotations, les surlignages incorrects ont disparu.

@ContextConfiguration(classes = {...})
K. Gol
la source
uniquement pour les packages de test!
Iakov Senatov le
2

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

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
la source
Lorsqu'il est câblé automatiquement dans un constructeur, il est@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren
2

Pour moi, la solution était de placer @EnableAutoConfigurationdans la classe Application sous le @SpringBootApplicationson va le souligner car c'est redondant. Supprimez-le et voila tous les avertissements concernant les haricots manquants ont disparu! Printemps idiot ...

Farkas Archie Bako
la source
2

dans mon cas, l'annuaire que j'essayais de @Autowired n'était pas au même niveau,

après l'avoir mis en place au même niveau de structure, l'erreur a disparu

j'espère que cela peut aider quelqu'un!

Davel_AG
la source
1

Ma solution à ce problème dans mon application Spring Boot était d'ouvrir le contexte de l'application Spring et d'ajouter manuellement la classe du bean câblé automatique manquant!

(accès via le menu Structure du projet ou la fenêtre de l'outil Spring ... éditer "Spring Application Context")

Donc, au lieu de SpringApplicationContext ne contenant que ma configuration de ressort ExampleApplication, il contient également le Bean manquant:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

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

UV
la source
1

Cela semble être encore un bogue dans la dernière IntelliJ et a à voir avec un problème de mise en cache possible?

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

Jensen Buck
la source
1

Tout ce que vous devez faire pour que cela fonctionne est le code suivant:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
Olammy
la source
1

Je devais juste utiliser @EnableAutoConfiguration pour y remédier, mais cette erreur n'avait aucun impact fonctionnel.

Codeur intelligent
la source
1

Il peut être résolu en plaçant @EnableAutoConfiguration sur la classe principale de l'application Spring Boot.

Nirbhay Rana
la source
0

Parfois - dans mon cas c'est le cas - la raison est une mauvaise importation. J'ai importé accidentellement

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. Cela m'a pris quelques minutes la première fois que cela s'est produit :-)

Christoph Grimmer-Dietrich
la source
0

Étonnamment, un projet orienté Feign qui s'est exécuté avec succès avec Eclipse n'a pas pu s'exécuter dans InteliJ. Au démarrage de l'application, InteliJ s'est plaint du client Feign que j'ai essayé d'injecter dans la couche serviceImpl en disant: field personRestClient (mon client Feign) dans ... nécessitait un bean de type ... qui n'a pas pu être trouvé. Pensez à définir un bean de type '....' dans votre configuration.

J'ai perdu beaucoup de temps à essayer de comprendre ce qui ne va pas. J'ai trouvé une solution (pour InteliJ) que je ne comprends pas complètement:

  1. Alt Shift F10 (ou exécuter le menu)
  2. Sélectionnez 'Modifier la configuration'
  3. Dans la fenêtre de configuration, cochez la case "Inclure les dépendances avec une portée" Fournie "
  4. Exécutez votre application

Ou choisissez Eclipse :)

ylev
la source
0

Vérifiez si le package de votre bean est écrit correctement

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


import ...

@Service
class ServiceX {

  ...

}
Jöcker
la source
0

Utilisez @AutoConfigureMockMvc pour la classe de test.

Harshad Thombare
la source
0

J'ai résolu le problème en installant le plugin mybatis dans IDEA. Lorsque j'ai installé Mybatis Plugin, il a disparu.

Snkpty
la source
0

simple vous devez faire 2 étapes

  1. ajouter une dépendance hibernate-core
  2. remplacez @Autowired par @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
la source
Expliquez votre réponse.
mentallurg
0

IntelliJ IDEA Ultimate

Ajoutez votre classe principale au contexte d'application IntelliJ Spring, par exemple Application.java

File -> Project Structure..

côté gauche: Paramètres du projet -> Modules

côté droit: recherchez dans la structure de votre package Springet ajoutez+ Application.java

Anton Bondarenko
la source
C'est égal à réponse UV
Anton Bondarenko