49 votes

L'application Spring ne démarre pas en dehors d'un package

Je suis este pour construire une application de base avec Spring. Elle fonctionne parfaitement tant que je respecte cette structure de sous-répertoires :

 src
     main
         java
             hello

Si je déplace mon Application.java y ScheduledTasks.java à partir du paquet hello, j'obtiens l'erreur suivante :

** WARNING ** : Your ApplicationContext is unlikely to start due to a `@ComponentScan` of the default package.

Et quelques secondes plus tard, en effet...

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.context.annotation.AnnotationConfigApplicationContext@71fa8894: startup date [Wed Jan 18 22:19:12 CET 2017]; root of context hierarchy

Ma question est la suivante : pourquoi dois-je mettre mes classes dans un paquet ? Quelle en est l'utilité ? Comment puis-je éviter cette erreur ? Ai-je vraiment besoin d'utiliser des packages s'il s'agit d'une application vraiment simple ?

1 votes

Vérifiez : docs.spring.io/spring-boot/docs/current/reference/html/ . Votre @ComponentScan est de scanner chaque classe dans chaque jar dans votre classpath entier. C'est mauvais.

1 votes

Pour la même raison que vous ne gardez pas tous vos papiers d'affaires dans une pile géante sur le sol de votre bureau.

1 votes

"Comment puis-je éviter cette erreur ?" Ne créez pas de classes dans le par défaut paquet.

101voto

DimaSan Points 6296

Remettez vos fichiers java dans le dossier hello paquet.

Lorsqu'une classe n'inclut pas de déclaration de paquetage, elle est considérée comme faisant partie de l'arborescence de la classe. "paquet par défaut" . L'utilisation du "paquet par défaut" est généralement déconseillée et doit être évitée.

Cela peut poser des problèmes particuliers pour les applications Spring Boot qui utilisent @ComponentScan , @EntityScan o @SpringBootApplication les annotations, puisque chaque classe de chaque bocal sera lu.

Lire la suite aquí .

19voto

Meg Points 124

J'ai déplacé la classe annotée avec @SpringBootApplication du package par défaut vers un package spécifique et cela a fonctionné.

1 votes

Ce problème se produit s'il manque la déclaration 'package' dans la classe java annotée @SpringBootApplication. Ajoutez donc 'package' dans cette classe java si elle est manquante.

1voto

Amit Points 145

J'avais créé un dossier Maven vierge où le dossier Java était le dernier. J'ai ajouté la classe MainApplication.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {

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

    }
}

De plus, j'ai dû créer un paquetage dans le dossier Java tel que com.test, puis j'y ai déplacé ma classe MainApplication. Notez "package com.test ;" Maintenant ce package par défaut est recherché par Spring boot.

package com.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {

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

    }
}

Ensuite, ça a bien fonctionné.

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