with example conectar con application and java spring mongodb rest

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

Crear un servicio web RESTful

Todo estuvo bien hasta que intenté integrarlo a mongodb. Entonces sigo este tutorial.

Acceso a datos con MongoDB

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:

  1. Se debe usar la anotación adecuada para Spring Boot escaneando el bean , como @Component ;
  2. 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.