J'ai une application Spring-boot à plusieurs modules, j'ai deux sous-modules:
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
3 Réponses :
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.
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.
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") })
Je pense avoir trouvé la solution, j'ai ajouté @EnableMongoRepositories
pour scanner mon module de persistance:
@EnableMongoRepositories(basePackages = "com.medkhelifi.tutorials.persistence")
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.