IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

Spring boot & multi modules : @Autowired ne fonctionne pas


Sujet :

Spring Boot Java

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 198
    Points : 76
    Points
    76
    Par défaut Spring boot & multi modules : @Autowired ne fonctionne pas
    Salut,
    J'ai testé un spring boot project comme un un seul projet maven et tout ça marche. Maintenant, j'essaye de construire mon application à base de plusieurs sous modules
    • projet parent
      • module jpa
      • module service
      • module ui (spring boot module)


    module jpa - interface UserRepository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package org.plendo.jpa.entity;
     
    import org.springframework.data.jpa.repository.JpaRepository;
     
    public interface UserRepository  extends JpaRepository<User, String>{
     
    }
    module service - classe UserServiceImpl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package org.plendo.service.impl;
     
    import org.plendo.jpa.entity.User;
    import org.plendo.jpa.entity.UserRepository;
    import org.plendo.service.interfaces.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    @Service
    public class UserServiceImpl implements UserService {
     
    	@Autowired
    	UserRepository userRepository;
     
    	@Override
    	public User saveUser(User u) {
    		return userRepository.save(u);
    	}
     
    }
    module ui (spring boot) - UserRestController
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package org.plendo.ui.controller;
     
    import org.plendo.jpa.entity.User;
    import org.plendo.service.interfaces.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    public class UserRestController {
     
    	@Autowired
    	private UserService userService;
     
    	@RequestMapping(value = "/saveUser")
    	public User saveUser(User u) {
    		return userService.saveUser(u);
    	}
    }
    Classe Spring boot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package org.plendo.ui;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
     
    @SpringBootApplication
    public class App {
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    }
    et l'erreur générée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v1.4.2.RELEASE)
     
    20:12:08.052 [main] WARN  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRestController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.plendo.service.interfaces.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    20:12:08.068 [main] WARN  o.s.boot.SpringApplication - Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
    20:12:08.243 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter - 
     
    ***************************
    APPLICATION FAILED TO START
    ***************************
     
    Description:
     
    Field userService in org.plendo.ui.controller.UserRestController required a bean of type 'org.plendo.service.interfaces.UserService' that could not be found.
     
     
    Action:
     
    Consider defining a bean of type 'org.plendo.service.interfaces.UserService' in your configuration.
    Merci d'avance

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 25
    Points : 32
    Points
    32
    Par défaut
    Spring ne reconnait pas "UserService" comme un bean. Le principe de base pour repondre à ce problème est d'importer la configuration des beans de tous les modules qui s'intègrent au module spring boot; que cette configuration soit en xml ou en java.
    • Si ces beans sont configurés via xml, tu utilise l'annotation @ImportResource({".../../le-fichier-de-configuration-du-module.xml"})
    • si c'est de la configuration java, tu fais un @ComponentScan(basePackages ={"com.le.package.qui.contient.la.classe.de.configuration"})


    Enfin , n'oublies pas de bien gérer les dépendences entre tes modules en les referencant dans le pom.xml de maven ou son équivalent graddle.

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 198
    Points : 76
    Points
    76
    Par défaut
    Merci, j'ai fait la référence des dépendances dans chaque pom des sous modules.
    Mais pour la configuration (java) de chaque sous modules, je sais pas quoi mettre ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 25
    Points : 32
    Points
    32
    Par défaut
    Pour ce qui est de la configuration java avec spring boot, chacun des modules jpa et service doivent avoir une classe main annotée @SpringBootApplication. Cette classe constituera alors la classe de configuration de ton module et spring boot scannera ainsi tous les beans présents dans les sous-packages du package racine de cette classe.

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 198
    Points : 76
    Points
    76
    Par défaut
    en faite seul le module web est un projet spring boot, pour les autres modules jpa et service, sont des modules maven.
    Donc est ce que je dois ajouter les dépendances spring boot à ces modules ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 25
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par j_esti Voir le message
    en faite seul le module web est un projet spring boot, pour les autres modules jpa et service, sont des modules maven
    Comment configures-tu les beans spring contenus dans ces modules maven?

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 198
    Points : 76
    Points
    76
    Par défaut
    j'ai essayé de faire tourner un exemple dans un seul project, ç'est à dire les services sont dans un package à part, les jpa sont dans un package à part , la config spring boot et security dans un package à part ainsi que les rest controller.
    Donc pas de configuration spéciale c'est juste pour le datasource dans application.properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # DataSource settings:
    spring.datasource.url = jdbc:mysql://localhost:3306/db_demande
    spring.datasource.username = root
    spring.datasource.password = root
    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    # Specify the DBMS
    spring.jpa.database = MYSQL
    # Show or not log for each sql query
    spring.jpa.show-sql = true
    # Hibernate ddl auto (create, create-drop, update)
    spring.jpa.hibernate.ddl-auto = update
    # Naming strategy
    spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    ou bien au niveau du main du l'application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    @SpringBootApplication
    @EnableAutoConfiguration
    public class DemandeAuthV1Application {
     
    	public static void main(String[] args) throws ParseException {
    		ApplicationContext ctx = SpringApplication.run(DemandeAuthV1Application.class, args);
     
    	}
    }
    Les classes services sont annotées avec @service, les classes controleurs avec @restController et je fait l'autowiring des interfaces .
    Maintenat je divise l'application en sous modules, j'ai pas ajouté de configuration , je sais pas quoi ajouté pour que ça marche.
    J'ai essayé ça dans la classe main du module web
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @SpringBootApplication 
    @ComponentScan (basePackages={"org.plendo.service.interfaces", "org.plendo.ui.controller"})
    @EnableAutoConfiguration
    //@Configuration
    public class App {
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    }
    mais rien ne marche

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 25
    Points : 32
    Points
    32
    Par défaut
    Ainsi, il faut que tu configures les beans spring de chaque module via xml ou via java configuration (par exemple classe main annotée @SpringbootApplication). En bref, pour chaque module:
    • soit tu configures les beans spring dans un fichier applicationContext.xml. Après tu importe ce fichier xml dans la classe de configuration du module ui via
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      @ImportResource({"classpath:chemin/.../applicationContext.xml"})
    • soit tu configures les beans spring en créant une classe main annotée @SpringBootApplication, dans un package parent des packages qui contiennent tes classes annotée @Service et @Repository. Après tu pourra faire un
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
       @ComponentScan (basePackages={"org.plendo.service.interfaces", "org.plendo.ui.controller"})
      dans la classe de configuration du module ui

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2015, 16h20
  2. Réponses: 9
    Dernier message: 09/11/2014, 21h01
  3. [Framework] autowired ne fonctionne pas Spring Struts Hibernate
    Par younesms dans le forum Spring
    Réponses: 4
    Dernier message: 08/12/2012, 23h22
  4. Resources Projet Web Multi-Module avec Spring
    Par w3blogfr dans le forum Maven
    Réponses: 3
    Dernier message: 22/08/2012, 09h09
  5. [Security] @Autowired ne fonctionne pas -> NullPointerException
    Par Bourrine dans le forum Spring
    Réponses: 2
    Dernier message: 02/03/2011, 15h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo