web-dev-qa-db-fra.com

Spring Boot @autowired ne fonctionne pas, classes dans des packages différents

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

21
Aniket Patil

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")


59
jgr

Il suffit de placer les packages dans la balise @SpringBootApplication.

@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})

Faites le moi savoir.

4
LucaT

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.

3
mchlfchr

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.

2
Sreeni

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);
    }
}
2
sasanka

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.

1
Nikhil Kakade

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.

0
Gemasoft

J'ai eu le même problème. Cela a fonctionné pour moi lorsque j'ai supprimé le modificateur privé des objets Autowired.

0
Prerit Jain

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);
    }
}
0
gurman singh