java - example - ''El campo requería un bean de tipo que no se pudo encontrar''. error de primavera API relajante usando mongodb
spring boot mongodb (17)
Así que he estado aprendiendo Primavera en las parejas de la semana, he estado siguiendo este tutorial
Todo estuvo bien hasta que intenté integrarlo a mongodb. Entonces sigo este tutorial.
Pero mi práctica todavía está usando parcialmente el primero. Entonces mi estructura de directorio de proyectos es así.
src/
├── main/
│ └── java/
| ├── model/
| | └── User.java
| ├── rest/
| | ├── Application.java
| | ├── IndexController.java
| | └── UsersController.java
| └── service/
| └── UserService.java
└── resources/
└── application.properties
Este es mi modelo / archivo 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;
}
}
Este es mi archivo 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();
}
}
Este es mi servicio / archivo 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();
}
Podría compilarlos (estoy usando gradle para compilar porque estoy siguiendo el tutorial), pero cuando ejecuté el archivo jar arrojó este error.
LA APLICACIÓN NO PUEDE INICIAR
Descripción:
El campo userService en main.java.rest.UsersController requería un bean del tipo ''main.java.service.UserService'' que no se pudo encontrar.
Acción:
Considere definir un bean de tipo ''main.java.service.UserService'' en su configuración.
No estoy seguro de lo que está mal, empiezo a buscar en Google y descubrí que necesito incluir el archivo
Beans.xml
y registrar el servicio de usuario en él.
Lo hice pero no funciona.
Soy realmente nuevo en esto, así que realmente no tengo idea de lo que está sucediendo.
Agregue el
@Service
en el servicio / UserService.java.
Agregue el @Component en su clase de controlador. Que esto funcione
El uso de todas las anotaciones @ solucionó mi problema. (Sí, soy nuevo en Spring) Si está utilizando una clase de servicio, agregue @Service, y lo mismo para @Controller y @Repository.
Luego, estas anotaciones en App.java solucionaron el problema (estoy usando JPA + Hibernate)
@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")
Árbol de paquete:
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
En mi caso, acabo de colocar Class MyprojectApplication en un paquete (com.example.start) con el mismo nivel de modelo, controlador y paquetes de servicio.
En mi caso, accidentalmente definí el
abstract
clase de servicio al copiar y pegar.
@Serivce
@Valdiated
public abstract class MyService { // remove the abstract modifier!!!
}
Encontré el mismo problema y todo lo que tuve que hacer fue colocar la Aplicación en un paquete un nivel más alto que los paquetes de servicio, dao y dominio.
Este hilo es antiguo ahora pero estoy publicando mi respuesta, que puede ser útil para otros.
Tuve el mismo problema. Resultó que hay otra clase con el mismo nombre en otro módulo. Cambié el nombre de esa clase y resolvió el problema.
Esto puede suceder cuando dos beans tienen los mismos nombres.
Module1Beans.java
:
@Configuration
public class Module1Beans {
@Bean
public GoogleAPI retrofitService(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.google.com/")
.addConverterFactory(JacksonConverterFactory.create())
.build();
return retrofit.create(GoogleAPI.class);
}
}
Module2Beans.java
:
@Configuration
public class Module2Beans {
@Bean
public GithubAPI retrofitService(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.github.com/")
.addConverterFactory(JacksonConverterFactory.create())
.build();
return retrofit.create(GithubAPI.class);
}
}
Primero se crea un bean llamado
retrofitService
, y su tipo es
GoogleAPI
, luego cubierto por un
GithubAPI
porque ambos son creados por un método
retrofitService()
.
Ahora, cuando
@Autowired
un
GoogleAPI
obtendrá un mensaje como
Field googleAPI in com.example.GoogleService required a bean of type ''com.example.rest.GoogleAPI'' that could not be found.
He venido a esta publicación en busca de ayuda mientras uso Spring Webflux con Mongo Repository.
Mi error fue similar al propietario
Field usersRepository in foobar.UsersService required
a bean of type ''foobar.UsersRepository'' that could not be found.
Como estaba trabajando antes con Spring MVC, me sorprendió este error.
Debido a que encontrar ayuda no era tan obvio, estoy respondiendo a esta pregunta, ya que de alguna manera está relacionada y esta pregunta tiene un alto índice de resultados de búsqueda.
Lo primero es que debe recordar lo que se mencionó en la respuesta marcada como aceptada: jerarquía de paquetes.
La segunda cosa importante es que si usa Webflux, necesita usar un paquete diferente, mientras que cuando usa Spring MVC, por ejemplo, para MongoDB, debe agregar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
con reactivo al final.
Mis clases de implementación de Mapper en mi carpeta de destino se habían eliminado, por lo que mis interfaces de Mapper ya no tenían clases de implementación.
Por lo tanto, obtuve el mismo error. El
Field *** required a bean of type ***Mapper that could not be found.
Simplemente tuve que regenerar las implementaciones de mis mapeadores con maven y actualizar el proyecto ...
Normalmente podemos resolver este problema en dos aspectos:
-
Se debe usar la anotación adecuada para
Spring Boot
escaneando el
bean
, como
@Component
; - la ruta de exploración incluirá las clases tal como todas las demás mencionadas anteriormente.
Por cierto, hay una muy buena explicación de la diferencia entre @Component, @Repository, @Service y @Controller .
Pasé mucho tiempo debido a la importación automática.
Intellij Idea por qué importó
@Service
desde
import org.jvnet.hk2.annotations.Service;
en lugar de
import org.springframework.stereotype.Service;
!
Resuelto.
Por lo tanto, de forma predeterminada, se
@SpringBootApplication
todos los paquetes que se encuentren bajo la declaración
@SpringBootApplication
.
Suponiendo que mi clase principal
ExampleApplication
que tiene la declaración
@SpringBootApplication
se declara dentro de
com.example.something
, luego todos los componentes que se encuentran bajo
com.example.something
se escanean mientras que
com.example.applicant
no se escaneará.
Entonces, hay dos formas de hacerlo en función de esta question . Utilizar
@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})
De esa manera, la aplicación escaneará todos los componentes especificados, pero creo que si la escala se hiciera más grande.
¡Entonces uso el segundo enfoque, reestructurando mis paquetes y funcionó! Ahora la estructura de mis paquetes se volvió así.
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
También tuve el mismo error:
***************************
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
Y mis paquetes se construyeron de la misma manera que se menciona en la respuesta aceptada. Solucioné mi problema agregando la anotación EnableMongoRepositories en la clase principal de esta manera:
@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {
public static void main(String[] args) {
SpringApplication.run(CampaignAPI.class, args);
}
}
Tengo el mismo problema, solucionado agregando @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);
}
}
Y mi repositorio es:
package in.topthree.util;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface StudentMongo extends MongoRepository<Student, Integer> {
public Student findByUrl(String url);
}
Ahora funciona
Usar esto resolvió mi problema.
@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
@Service
agregar la anotación
@Service
a la implementación de su servicio.