web-dev-qa-db-fra.com

Pensez à définir un bean de type 'package' dans votre configuration [Spring-Boot]

Je reçois l'erreur suivante:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Je n'ai jamais vu cette erreur auparavant, mais il est étrange que le @Autowire ne fonctionne pas. Voici la structure du projet:

Interface du candidat

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

DemandeurImpl

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Maintenant, je devrais être en mesure de demander à Autowire Applicant de pouvoir accéder, mais dans ce cas, cela ne fonctionne pas lorsque je l’appelle dans mon @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ MISE À JOUR 1 -----------------------

J'ai ajouté

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebServiceApplication.class, args);
    }

}

et l'erreur est partie mais rien ne s'est passé. Cependant, lorsque j'ai commenté tout ce qui traitait de Applicant dans RestController avant d'ajouter @ComponentScan(), je pouvais renvoyer une chaîne de caractères UI, ce qui signifiait que mon RestController fonctionnait, maintenant il est sauté. Je moche Whitelabel Error Page maintenant.

--------------------- UPDATE 2 --------------------------- ---

J'ai ajouté le paquet de base du haricot dont il se plaignait. L'erreur lit:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

J'ai ajouté @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebServiceApplication.class, args);
    }

}

---------------------------- Mise à jour 3 -------------------- -

ajouter:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

continue à se plaindre de ma classe ApplicantImpl dans laquelle @Autowires mon compte _ TApplicantRepository.

67
Drew1208

C'est peut-être parce que le projet a été divisé en différents modules.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
143
Drew1208

Il semble que votre classe de candidats ne soit pas scannée. Par défaut, tous les paquets commençant par la racine en tant que classe dans laquelle vous avez mis @SpringBootApplication seront analysés.

supposez que votre classe main "WebServiceApplication" se trouve dans "com.service.something", tous les composants situés sous "com.service.something" seront analysés et "com.service.applicant" ne seront pas analysés.

Vous pouvez soit restructurer vos packages de sorte que "WebServiceApplication" tombe dans un package racine et que tous les autres composants en fassent partie. Vous pouvez également inclure @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"}) etc. de sorte que "TOUS" les composants soient analysés et initialisés dans le conteneur de ressort.

Mise à jour basée sur le commentaire

Si vous avez plusieurs modules gérés par maven/gradle, le package à analyser est le package à analyser. Vous indiquez à spring d'analyser "com.module1" et vous disposez d'un autre module dont le nom de package racine est "com.module2". Ces composants ne seront pas analysés. Vous pouvez même dire à spring d'analyser "com", qui analysera ensuite tous les composants de "com.module1." et de "com.module2."

40
Ameen.M

Il y a une chance ...
Il se peut que vous manquiez de l'annotation @Service, @Repository sur vos classes d'implémentation respectives.

27
CodeWorld

En gros, cela se produit lorsque vous avez votre application de classe dans "un autre package". Par exemple:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Je résous le problème avec cela dans Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

n autre moyen moins élégant consiste à: placer toutes les classes de configuration dans le même package.

18
Carlos Marcano

Je pense que vous pouvez le simplifier en annotant votre référentiel avec @Repository, puis il sera activé automatiquement par Spring Framework.

4

Dans mon cas, j'ai eu une terrible erreur. Je mets @Service jusqu'à l'interface de service.

Pour résoudre ce problème, j'ai mis @Service sur l'implémentation du fichier de service et cela a fonctionné pour moi.

4
Mohammad Falahi

Cela peut également arriver si vous utilisez Lombok et que vous ajoutez les @RequiredArgsConstructor et @NonNull pour les champs, mais que certains de vos champs ne doivent pas être injectés dans le constructeur. Ce n’est qu’une des possibilités d’obtenir la même erreur.

le paramètre 0 nécessitait un bean de type MissingBeanName introuvable.

Dans mon cas, l'erreur m'a dit quel contrôleur avait le problème, après avoir retiré @NonNull l'application a bien démarré

3
Dawid Gorczyca

Si un bean se trouve dans le même package dans lequel il est @Autowired, il ne causera jamais un tel problème. Cependant, les beans ne sont pas accessibles par défaut à partir de différents packages. Pour résoudre ce problème suivez ces étapes:

  1. Importation suivante dans votre classe principale:
    import org.springframework.context.annotation.ComponentScan;
  2. ajoutez des annotations sur votre classe principale:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
2
ASHWANI PANDEY

Dans mon cas, ces deux options ont fonctionné.

  1. dans //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) include aussi le paquet contenant le Application.class dans la liste, ou

  2. Ajoutez simplement @EnableAutoConfiguration; il reconnaît automatiquement tous les haricots de printemps.

2
Sriharsha g.r.v

J'ai cherché en ligne pour obtenir une réponse, mais il semble qu'il n'y ait pas de solution unique à mon cas: au tout début, tout fonctionne comme suit:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Ensuite, j'essaie d'ajouter une carte pour mettre en cache quelque chose et cela devient ceci:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Boom!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'Java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'Java.lang.String' in your configuration.

J'ai enlevé le @AllArgsConstructor(onConstructor = @__(@Autowired)) et ajouter @Autowired pour chaque repository et service sauf le Map<String, String>. Cela fonctionne comme avant.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

J'espère que cela pourrait être utile.

2
Hearen
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
1
developer07

Cela a fonctionné pour moi après avoir ajouté l'annotation ci-dessous dans l'application:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Je recevais l'erreur ci-dessous:

"Le paramètre 1 du constructeur dans requis un bean de type mappeur qui n'a pas pu être trouvé:

1
Love Kumar

Cela peut arriver si la classe @Service est marquée comme abstraite.

1
Ariel

Si votre dépendance de classe est gérée par Spring, ce problème peut survenir si nous avons oublié d'ajouter le constructeur arg par défaut/vide dans notre classe POJO.

0
Arif Khan

Dans mon cas, cette erreur apparaît parce que mon importation était incorrecte. Par exemple, en utilisant spring, l'importation apparaît automatiquement:

import org.jvnet.hk2.annotations.Service;

mais j'avais besoin de:

import org.springframework.stereotype.Service;
0
Washington da Silva

J'ai eu un cas où j'ai besoin d'injecter RestTemplate dans une classe de service. Cependant, RestTemplate ne peut pas être récupéré par la classe de service. Ce que j'ai fait est de créer une classe wrapper dans le même package que l'application principale et de marquer le wrapper en tant que composant et d'autowire ce composant dans la classe de service. Problème résolu. espérons que cela fonctionne aussi pour vous

0
user11976602