2017-10-13 1 views
0

Tout en modularisant notre projet en différents projets maven indépendants utilisant spring boot et maven, nous avons rencontré un problème où l'autowiring des beans dans le projet multi module maven ne fonctionne pas.Spring Boot L'auto-câblage des haricots ne fonctionne pas dans le projet multi-module maven

Juste pour vous donner un aperçu de la question, ci-dessous sont les projets Maven indépendants développés jusqu'à présent

  1. CoreServices - Contient des objets de domaine de démarrage de printemps d'application entière: sortie JAR
  2. DBservices1-Contains démarrage de printemps référentiels et services (services de base de données) pour accéder à la base de données: sortie JAR
  3. Récompenses -Contient module récompenses fichiers liés (contrôleurs, services (Business Logic services), Vues): sortie JAR
  4. RewardsApp- depl indépendant projet oyable Maven: Sortie WAR

Voici la structure de dépendance RewardsApp-> Récompenses -> DBservices1 -> CoreServices

Le problème est annotation @Autowired utilisé dans Récompenses et DBservices1 pour aller chercher les services mis en correspondance annotées avec @Service/@Repository ne sont pas disponibles dans le projet RewardsApp.

Pour contourner ce problème, nous avons configuré les beans en RewardsApp avec l'annotation @Bean, puis les services sont disponibles pour le démarrage du serveur. Avec cette approche, nous devons configurer manuellement tous les beans dans RewardsApp utilisés dans les projets dépendants. Nous avons de nombreux services et référentiels dans notre application et nous pensons que la création de haricots comme celui-ci n'est pas une bonne façon car il faut créer de nombreux haricots.

S'il vous plaît noter que nous avons créé tous les contrôleurs de démarrage du printemps, les services, repositorys dans tous les projets dans le cadre package com.company.application

est Ci-dessous l'extrait de classe principale:

@SpringBootApplication 
@ComponentScan(basePackages = {"com.company.application"}) 
public class RewardsApp extends SpringBootServletInitializer { 

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

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(RewardsApp.class); 
    } 
} 

/** 
*Manual beans in RewardsApp 
**/ 
@Bean 
public SomeService someService() 
{ 
    return new SomeService(); 
} 
+0

Est-ce que votre 'RewardsApp' est également dans le paquet' com.company.application'? Si ce n'est pas le cas, placez-le ou dans le paquet 'com.company' et supprimez le' @ ComponentScan' (qui est déjà impliqué par '@ ComponentScan'). –

Répondre

0

En ajoutant ci-dessous annotation dans RewardsApp.java a fait l'affaire pour moi, maintenant Autowiring travaillait pour les classes à l'intérieur des pots

@ComponentScan(basePackages = {"com.company"}) 
@EntityScan(basePackages = {"com.company"}) 
@EnableJpaRepositories(basePackages = {"com.company"}) 

Je suppose que ci-dessus sont pour les services, Entités (Domaines), Dépôts

2

Que diriez-vous d'avoir une configuration class (avec des analyses comp pertinentes) pour chaque module et l'importation de ces configs dans votre classe d'application?

@SpringBootApplication 
@ComponentScan(...) 
@Import({RewardsContext.class, DBservicesContext.class}) 
... 

Import docs here