157 votes

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

J'obtiens 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 l'@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;
}

ApplicantImpl

@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 d'Autowire Applicant et d'y accéder, mais dans ce cas, cela ne fonctionne pas lorsque je l'appelle dans ma page d'accueil. @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";
    }

}

------------------------UPDATE 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 a disparu mais rien ne s'est produit. Cependant, lorsque j'ai commenté tout ce qui concerne Applicant dans le RestController avant d'ajouter @ComponentScan() J'ai pu renvoyer une chaîne de caractères le UI ce qui signifie que mon RestController fonctionnait, maintenant il est ignoré. Je suis moche Whitelabel Error Page maintenant.

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

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

***************************
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);
    }

}

----------------------------Update 3----------------------

en ajoutant :

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

se plaint toujours de mon ApplicantImpl classe qui @Autowires mon repo TApplicantRepository en elle.

0 votes

Où se trouve votre fichier de contexte d'application ? Si vous n'en avez pas, vous devriez envisager de donner à l Printemps un indice avec des annotations comme @ComponentScan pour rendre tous les haricots disponibles.

0 votes

@MarioSantini veuillez voir la mise à jour 1

0 votes

Je suppose qu'après chaque mise à jour, les erreurs ont été modifiées ? Si possible, postez la structure de votre projet, et les journaux d'erreurs/stacktrace dans chaque cas Il est préférable de savoir "pourquoi" ces erreurs se sont produites, plutôt qu'un "quelque chose" a fait disparaître l'erreur. Ce sera utile pour les autres qui rencontrent un problème similaire.

266voto

Drew1208 Points 1743

Cela peut être dû au fait 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 {

10 votes

Cool. Mon projet est divisé par un certain nombre de modules. ComponentScan a résolu mon problème !

0 votes

L'annotation ComponentScan résout mon problème mais pas @EnableAutoConfiguration.

0 votes

En fait, EnableAutoConfiguration définit implicitement un "paquet de recherche" de base pour certains éléments et l'utilisation d'un paquet racine permet également d'utiliser l'annotation ComponentScan sans avoir à spécifier un attribut basePackage. Et l'annotation @SpringBootApplication peut être utilisée si votre classe principale se trouve dans le paquet Root.

91voto

CodeWorld Points 224

Il y a une chance...
Vous pourriez manquer @Service , @Repository sur vos classes d'implémentation respectives.

4 votes

Ceci devrait être la réponse acceptée, une solution simple et directe. Merci.

1 votes

Merci, il me manquait l'annotation @Repository

2 votes

Oui, ça devrait être la réponse. Les réponses ci-dessus supposent simplement que le scan a échoué, ce qui est faux.

52voto

Ameen.M Points 1093

Votre classe de candidats n'est pas scannée, il semble. Par défaut, tous les paquets commençant par la Racine comme la classe où vous avez mis @SpringBootApplication sera scanné.

supposez que votre main La classe "WebServiceApplication" se trouve dans " com.service.something ", alors tous les composants qui relèvent de " com.service.something " est scanné, et " com.service.applicant "ne sera pas scanné.

Vous pouvez soit restructurer vos paquets de sorte que "WebServiceApplication" relève d'un paquet racine et que tous les autres composants fassent partie de ce paquet racine. Ou vous pouvez 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 printemps.

Mise à jour en fonction du commentaire

Si vous avez plusieurs modules qui sont gérés par maven/gradle, tout ce dont Spring a besoin est le paquet à analyser. Si vous demandez à Spring d'analyser "com.module1" et que vous avez un autre module dont le nom du paquet racine est "com.module2", ces composants ne seront pas analysés. Vous pouvez même demander à spring d'analyser "com" qui va ensuite analyser tous les composants dans " com.module1. " et " com.module2. "

0 votes

Mon projet est structuré en différents modules. Par exemple les services auront leur propre module et build.gradle . Ces build.gradle sont ajoutés à la liste des modules dependencies du module avec la méthode principale. Par conséquent, lorsque vous avez vu @ComponentScan("module-service") c'est ce que je pensais qui fonctionnerait. Cependant, à l'intérieur module-service a un paquet. Alors ma question est : à quoi cela ressemble-t-il ? Dois-je simplement nommer le nom du paquet ou le nom du module ou les deux ?

0 votes

Il importe peu que les paquets relèvent de différents modules. Les paquets dans lesquels les composants doivent être analysés doivent être spécifiés à spring. Vous pouvez donner tous les noms de paquets "racine" de tous vos modules dans l'attribut "scanBasePackages" Et ce sont tous les "packages" qui doivent être mentionnés, pas les modules.

0 votes

J'ai fait ce que vous avez dit et l'erreur a disparu, mais je me suis plaint d'un autre paquet. Naturellement, je l'ai ajouté à la liste mais il ne disparaît pas. Je l'ai implémenté comme ceci : @SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})

27voto

Carlos Marcano Points 111

En fait, cela se produit lorsque votre application de classe se trouve dans "un autre paquet". 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 ceci dans l'Application.class

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

Une autre méthode moins élégante consiste à placer toutes les classes de configuration dans le même paquet.

4 votes

En fait, vous n'avez pas besoin de spécifier @ComponentScan dans le scénario ci-dessus. Parce que votre Application.class (qui a le @SpringBootApplication ) est placé dans com.server qui est de toute façon la Racine pour les deux com.server.config ainsi que com.server.repository .

0 votes

@Ameen.MTC'est exactement ma question, pourquoi il n'y a toujours pas de solution et pourquoi il faut un scan explicite pour les dépôts mongo en utilisant @EnableMongoRepositories ?

5voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X