1
votes

Module multiple Spring Boot Pensez à définir un bean de type dans votre configuration

J'ai une application Spring-boot à plusieurs modules, j'ai deux sous-modules:

  • spring-boot-rest-api-todo-list
  • persistance

qui sont organisés comme ceci:

module de persistance

@ComponentScan ({"com.medkhelifi.tutorials"})
@ComponentScan ({"com.medkhelifi.tutorials.persistence", "com.medkhelifi.tutorials.springboot"})

spring-boot -rest-api-todo-list module

Field userRepository in com.medkhelifi.tutorials.springboot.restapi.todolist.RestTodoListApplication required a bean of type 'com.medkhelifi.tutorials.persistence.model.repositories.UserRepository' that could not be found.

Action:

Consider defining a bean of type 'com.medkhelifi.tutorials.persistence.model.repositories.UserRepository' in your configuration.

Dans mon module rest-api, je veux scanner les deux modules (persistence et restapi) et je procède comme ceci:

@SpringBootApplication
@ComponentScan ({"com.medkhelifi.tutorials.springboot", "com.medkhelifi.tutorials.persistence"})
public class RestTodoListApplication  {
    @Autowired
    private UserRepository userRepository;

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

Mais j'ai cette erreur:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>tutorials</artifactId>
        <groupId>com.medkhelifi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-rest-api-todo-list</artifactId>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <start-class>com.medkhelifi.tutorials.springboot.restapi.todolist.RestTodoListApplication</start-class>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>com.medkhelifi</groupId>
            <artifactId>persistence</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-rest-api-todo-list</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Si je supprime "com.medkhelifi.tutorials .spring-boot " de ComponentScan l'erreur disparaît mais mes contrôleurs sous mon module restapi ne fonctionneront pas.

J'ai essayé de nombreuses variantes de ComponentScan, mais avec la même erreur:

XXX


0 commentaires

3 Réponses :


0
votes

Spring essaie de rechercher la dépendance Autowired mais ne la trouve nulle part.

Essayez d'ajouter ceci:

@EnableJpaRepositories ({"com.medkhelifi.WhereverYourRepoIs"})

Si je ne me trompe pas, vous devez indiquer à SpringBoot où trouver vos dépôts, surtout s'ils se trouvent dans un module différent de votre @SpringBootApplication.


4 commentaires

J'utilise ce @ComponentScan ({"com.medkhelifi.tutorials.springboot", "com.medkhelifi.tutorials.persistence"}) et cela fonctionne si je scanne uniquement le package de persistance mais quand je scanne les deux packages, j'ai l'erreur.


Eh bien, je ne sais pas ce qu'il y a dans chacun de vos packages, mais l'erreur indique clairement qu'il ne peut pas trouver le dépôt et je me souviens un peu que vous deviez les activer avec cette annotation ...


Comme je le vois, SpringBoot essaie de localiser userRepo dans le package springboot, mais il sera probablement défini dans le package persistance. Pour en informer SpringBoot, utilisez le @EnableJpaRepositories ({"com.medkhelifi.tutorials.persistenc‌ e"}) :) :)


Il n'est pas nécessaire de fournir @EnableJpaRepositories avec Spring Boot. s'il y a une dépendance de spring-data dans le chemin de classe, la configuration automatique configure automatiquement les dépôts Jpa.



0
votes

Votre câblage automatique se produit dans la classe d'application principale que vous n'avez pas fournie comme package de base pour l'analyse des composants. Essayez ceci

@ComponentScan(value = {"com.medkhelifi.tutorials",
        "com.medkhelifi.tutorials.persistence", "com.medkhelifi.tutorials.restapi" })

OU

@ComponentScans(value = { @ComponentScan("com.medkhelifi.tutorials"),
        @ComponentScan("com.medkhelifi.tutorials.persistence"), @ComponentScan("com.medkhelifi.tutorials.restapi") })


0 commentaires

1
votes

Je pense avoir trouvé la solution, j'ai ajouté @EnableMongoRepositories pour scanner mon module de persistance:

@EnableMongoRepositories(basePackages = "com.medkhelifi.tutorials.persistence")


2 commentaires

a-t-il résolu? spring boot configure automatiquement s'il a trouvé la dépendance data-mongodb dans classpath


Oui, cela a résolu mon problème Depuis que j'utilise MongoDb, il n'y a pas de place pour utiliser @EnableJpaRepository mais à la place, j'ai utilisé EnableMongoRepositories.