J'ai une application de démarrage Spring.
Je reçois l'erreur suivante
org.springframework.beans.factory.BeanCreationException: Erreur lors de la création d'un bean avec le nom 'birthdayController': L'injection de dépendances autowired a échoué; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: le champ autowire ne peut pas être autowire: private com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository; L'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type [com.esri.birthdays.dao.BirthdayRepository] trouvé pour la dépendance: attendu au moins 1 bean qui est considéré comme candidat autowire pour cette dépendance. Annotations de dépendances: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} à org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues .4.RELEASE.jar: 4.2.4.RELEASE] à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.Java:1214) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2. 4.RELEASE] à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.Java:543) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] à org.springframe. beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.Java:482) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] à l'adresse org.springframework.beans.factory.support ,. getObject (AbstractBeanFactory.Java:306) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4.LELEASE] à ou
Voici le code de ma classe Repository
package com.esri.birthdays.dao;
import com.esri.birthdays.model.BirthDay;
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
Ce qui suit est le contrôleur.
package com.esri.birthdays.controller;
@RestController
public class BirthdayController {
@Autowired
private BirthdayRepository repository;
Fonctionne si elles sont dans le même paquet. Je ne sais pas pourquoi
Lorsque vous utilisez l'annotation @SpringBootApplication dans, par exemple, package
com.company.config
il va automatiquement faire l'analyse des composants comme ceci:
@ComponentScan("com.company.config")
Donc, il n’analysera PAS les paquets tels que com.company.controller, etc. C’est pourquoi vous devez déclarer votre @SpringBootApplication dans le paquet un niveau avant vos paquets normaux comme celui-ci: com.company OR use propriété scanBasePackages, comme ceci:
@SpringBootApplication(scanBasePackages = { "com.company" })
OU composantScan:
@SpringBootApplication
@ComponentScan("com.company")
Il suffit de placer les packages dans la balise @SpringBootApplication.
@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})
Faites le moi savoir.
Essayez d'annoter vos classes de configuration avec l'annotation @ComponentScan("com.esri.birthdays")
. En règle générale: si votre projet contient des sous-packages, vous devez rechercher vos classes pertinentes sur la racine du projet. Je suppose que pour votre cas ce sera "com.esri.birthdays". Vous n'aurez pas besoin de ComponentScan si vous n'avez pas de sous-conditionnement dans votre projet.
Pour ce genre de problème, j'ai fini par mettre @Service
annotation sur la classe de service nouvellement créée, le fil automatique a été repris. Donc, essayez de vérifier les classes qui ne sont pas auto-câblées, si elles ont besoin des annotations requises correspondantes (comme @Controller
, @Service
, etc.) s’appliquent à eux et essaient ensuite de reconstruire le projet.
Spring Boot gère automatiquement ces référentiels tant qu'ils sont inclus dans le même package (ou sous-package) de votre classe @SpringBootApplication. Pour plus de contrôle sur le processus d'enregistrement, vous pouvez utiliser l'annotation @EnableMongoRepositories. guides spring.io
@SpringBootApplication
@EnableMongoRepositories(basePackages = {"RepositoryPackage"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Dans mon cas, @component
Ne fonctionnait pas car j'avais initialisé cette instance de classe en utilisant new <classname>()
.
Si nous initialisons l'instance par la méthode classique Java n'importe où dans le code, alors spring n'ajoutera pas ce composant dans le conteneur IOC.
Essaye ça:
@Repository
@Qualifier("birthdayRepository")
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
Et lors de l'injection du haricot:
@Autowired
@Qualifier("birthdayRepository")
private BirthdayRepository repository;
Sinon, vérifiez votre CoponentScan dans votre configuration.
J'ai eu le même problème. Cela a fonctionné pour moi lorsque j'ai supprimé le modificateur privé des objets Autowired.
Il y aura certainement un haricot contenant également des champs en rapport avec Birthday. Utilisez-le afin que votre problème soit résolu.
@SpringBootApplication
@EntityScan("com.Java.model*") // base package where bean is present
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}