Donc, j'ai appris le printemps dans les couples de la semaine, j'ai suivi ce tutoriel
Création d'un service Web RESTful
Tout allait bien jusqu'à ce que j'essaye de l'intégrer à Mongodb. Alors je suis ce tutoriel.
Accès aux données avec MongoDB
Mais ma pratique utilise encore partiellement le premier. Donc, ma structure de répertoire de projet est comme ça.
src/
├── main/
│ └── Java/
| ├── model/
| | └── User.Java
| ├── rest/
| | ├── Application.Java
| | ├── IndexController.Java
| | └── UsersController.Java
| └── service/
| └── UserService.Java
└── resources/
└── application.properties
Ceci est mon fichier model/User.Java
package main.Java.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="user")
public class User {
private int age;
private String country;
@Id
private String id;
private String name;
public User() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Ceci est mon fichier rest/UsersController.Java
package main.Java.rest;
import Java.util.List;
import main.Java.service.UserService;
import main.Java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/users")
public class UsersController {
@Autowired
UserService userService;
@RequestMapping(method = RequestMethod.GET)
public List<User> getAllUsers() {
return userService.findAll();
}
}
Ceci est mon fichier service/UserService.Java
package main.Java.service;
import Java.util.List;
import main.Java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserService extends MongoRepository<User, String> {
public List<User> findAll();
}
Je pourrais les compiler (j'utilise gradle pour la compilation parce que je suis le tutoriel), mais lorsque je lance le fichier jar, cette erreur est générée.
APPLICATION ÉCHOUÉE AU DÉMARRAGE
La description:
Le champ userService dans main.Java.rest.UsersController nécessitait un bean de tapez 'main.Java.service.UserService' introuvable.
Action:
Pensez à définir un bean de type 'main.Java.service.UserService' dans votre configuration.
Ne sachant pas ce qui ne va pas, je commence à chercher sur Google et découvre que je dois inclure le fichier Beans.xml
et y inscrire le service utilisateur. J'ai fait ça mais ça ne marche pas. Je suis vraiment nouveau dans ce domaine, je n'ai donc aucune idée de ce qui se passe.
Résolu. Donc, par défaut, tous les paquets qui relèvent de la déclaration @SpringBootApplication
seront analysés.
En supposant que ma classe principale ExampleApplication
ayant la déclaration @SpringBootApplication
soit déclarée dans com.example.something
, tous les composants relevant de com.example.something
sont analysés, alors que com.example.applicant
ne le sera pas.
Donc, il y a deux façons de le faire en fonction de cette question . Utilisation
@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})
De cette façon, l'application analysera tous les composants spécifiés, mais je pense que si l'échelle devenait plus grande?
J'utilise donc la deuxième approche, en restructurant mes paquets et cela a fonctionné! Maintenant, la structure de mes paquets est devenue comme ça.
src/
├── main/
│ └── Java/
| ├── com.example/
| | └── Application.Java
| ├── com.example.model/
| | └── User.Java
| ├── com.example.controller/
| | ├── IndexController.Java
| | └── UsersController.Java
| └── com.example.service/
| └── UserService.Java
└── resources/
└── application.properties
Ajoutez le @Service
dans le service/UserService.Java.
J'ai aussi eu la même erreur:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found.
Action:
Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here
Et mes colis ont été construits de la même manière que celle mentionnée dans la réponse acceptée. J'ai résolu mon problème en ajoutant l'annotation EnableMongoRepositories dans la classe principale comme ceci:
@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {
public static void main(String[] args) {
SpringApplication.run(CampaignAPI.class, args);
}
}
J'ai rencontré le même problème et tout ce que j'avais à faire était de placer l'application dans un package d'un niveau supérieur à celui des packages service, dao et domain.
Ce fil est ancien maintenant, mais je poste ma réponse, ce qui peut être utile pour d'autres.
J'ai eu le même problème ... Il s'est avéré qu'il existe une autre classe avec le même nom dans un autre module. J'ai renommé cette classe et cela a résolu le problème.
A passé beaucoup de temps à cause de l'importation automatique . Intellij Idea somewhy a importé @Service
de import org.jvnet.hk2.annotations.Service;
au lieu de import org.springframework.stereotype.Service;
!
Normalement, nous pouvons résoudre ce problème sous deux aspects:
@Component
;À propos, il existe une très bonne explication de la différence entre @Component, @Repository, @Service et @Controller .
Ajoutez le @Component dans votre classe de contrôleur. Que ce travail
Je suis venu à ce poste à la recherche d'aide pour utiliser Spring Webflux avec Mongo Repository.
Mon erreur était semblable au propriétaire
Field usersRepository in foobar.UsersService required
a bean of type 'foobar.UsersRepository' that could not be found.
Comme je travaillais auparavant avec Spring MVC, cette erreur m'a surpris.
Parce que trouver de l'aide n'était pas si évident, je réponds à cette question car elle est en quelque sorte liée et que cette question a beaucoup de résultats de recherche.
La première chose à faire est de vous rappeler ce qui a été mentionné dans la réponse marquée comme étant acceptée - la hiérarchie des paquets.
Deuxièmement, si vous utilisez Webflux, vous devez utiliser un package différent lorsque vous utilisez Spring MVC, par exemple. pour MongoDB vous devez ajouter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
avec -réactif à la fin.
Utiliser toutes @ Annotations a résolu mon problème. (Oui, je suis nouveau dans Spring) Si vous utilisez une classe de service, ajoutez @Service, de même pour @Controller et @Repository.
Ensuite, ces annotations sur l'App.Java ont corrigé le problème (j'utilise JPA + Hibernate)
@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")
Arbre de package:
src/
├── main/
│ └── Java/
| ├── es.unileon.inso2/
| | └── App.Java
| ├── es.unileon.inso2.model/
| | └── User.Java
| ├── es.unileon.inso2.controller/
| | ├── IndexController.Java
| | └── UserController.Java
| ├── es.unileon.inso2.service/
| | └── UserService.Java
| └── es.unileon.inso2.repository/
| └── UserRepository.Java
└── resources/
└── application.properties
J'ai le même problème, résolu par Add @EnableMongoRepositories ("in.topthree.util")
package in.topthree.core;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import in.topthree.util.Student;
@SpringBootApplication
@EnableMongoRepositories("in.topthree.util")
public class Run implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Run.class, args);
System.out.println("Run");
}
@Autowired
private Process pr;
@Override
public void run(String... args) throws Exception {
pr.saveDB(new Student("Testing", "FB"));
System.exit(0);
}
}
Et mon dépôt
package in.topthree.util;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface StudentMongo extends MongoRepository<Student, Integer> {
public Student findByUrl(String url);
}
Maintenant son travail
Dans mon cas, j’ai accidentellement défini la classe de service abstract
en faisant un copier-coller.
@Serivce
@Valdiated
public abstract class MyService { // remove the abstract modifier!!!
}
Vous devez ajouter l'annotation @Service
à l'implémentation de votre service.
Mes classes d'implémentation Mapper dans mon dossier cible avaient été supprimées, donc mes interfaces Mapper n'avaient plus de classes d'implémentation. J'ai donc la même erreur Field *** required a bean of type ***Mapper that could not be found.
Je devais simplement régénérer mes mises en œuvre de mappeurs avec maven et actualiser le projet ...
Dans mon cas, je viens de placer Class MyprojectApplication dans un package (com.example.start) avec le même niveau de modèle, de contrôleur et de packages de service.