qualifier example espaƱol ejemplo data crudrepository spring spring-boot spring-data repository spring-data-jpa

example - No se puede Autowire @Repository interfaz anotada en Spring Boot



spring data (9)

Aquí está el error: como alguien dijo antes, estás usando org.pharmacy insted of com.pharmacy en componentscan

package **com**.pharmacy.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan("**org**.pharmacy") public class SpringBootRunner {

Estoy desarrollando una aplicación de arranque de primavera y me encuentro con un problema aquí. Intento inyectar una interfaz anotada @Repository y parece que no funciona en absoluto. Estoy recibiendo este error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''springBootRunner'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) at com.pharmacy.config.SpringBootRunner.main(SpringBootRunner.java:25) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 16 common frames omitted Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 18 common frames omitted

Aquí está mi código:

Clase de aplicación principal:

package com.pharmacy.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan("org.pharmacy") public class SpringBootRunner { public static void main(String[] args) { SpringApplication.run(SpringBootRunner.class, args); } }

Clase de entidad:

package com.pharmacy.persistence.users; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class UserEntity { @Id @GeneratedValue private Long id; @Column private String name; }

Interfaz de repositorio:

package com.pharmacy.persistence.users.dao; import com.pharmacy.persistence.users.UserEntity; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository public interface UserEntityDao extends CrudRepository<UserEntity,Long>{ }

Controlador:

package com.pharmacy.controllers; import com.pharmacy.persistence.users.UserEntity; import com.pharmacy.persistence.users.dao.UserEntityDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HomeController { @Autowired UserEntityDao userEntityDao; @RequestMapping(value = "/") public String hello() { userEntityDao.save(new UserEntity("ac")); return "Test"; } }

build.gradle

buildscript { ext { springBootVersion = ''1.2.2.RELEASE'' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: ''java'' apply plugin: ''idea'' apply plugin: ''spring-boot'' mainClassName = "com.pharmacy.config.SpringBootRunner" jar { baseName = ''demo'' version = ''0.0.1-SNAPSHOT'' } repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-ws") compile("postgresql:postgresql:9.0-801.jdbc4") testCompile("org.springframework.boot:spring-boot-starter-test") }

application.properties:

spring.view.prefix: / spring.view.suffix: .html spring.jpa.database=POSTGRESQL spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=update spring.datasource.driverClassName=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=abc123

Incluso comparé mi código con Acceso a datos jpa , y me estoy quedando sin ideas sobre qué está mal con este código. Cualquier ayuda apreciada. Gracias por adelantado.

EDITADO: Cambié mi código como se sugirió para que parezca anterior, y no estoy obteniendo ese error cuando estoy inyectando mi interfaz @Repository en otro componente. Sin embargo, tengo un problema ahora: mi componente no se puede recuperar (utilicé la depuración). ¿Qué estoy haciendo mal así que la primavera no puede encontrar mi componente?


Cuando el paquete del repositorio es diferente a @SpringBootApplication / @EnableAutoConfiguration , se requiere que el paquete base de @EnableJpaRepositories se defina explícitamente.

Intenta agregar @EnableJpaRepositories("com.pharmacy.persistence.users.dao") a SpringBootRunner


Está escaneando el paquete incorrecto: @ComponentScan (" org .pharmacy")

Donde debería ser: @ComponentScan (" com .pharmacy")

Dado que los nombres de sus paquetes comienzan con com y no org.


Hay otra causa para este tipo de problema que me gustaría compartir, porque lucho en este problema por algún tiempo y no pude encontrar ninguna respuesta sobre SO.

En un repositorio como:

@Repository public interface UserEntityDao extends CrudRepository<UserEntity, Long>{ }

Si su entidad UserEntity no tiene la anotación @Entity en la clase, tendrá el mismo error.

Este error es confuso para este caso, porque se enfoca en tratar de resolver el problema sobre Spring, pero no encontró el repositorio, pero el problema es la entidad. Y si llegaste a esta respuesta intentando probar tu Repositorio, esta respuesta puede ayudarte


Parece que su anotación @ComponentScan no está configurada correctamente. Tratar :

@ComponentScan(basePackages = {"com.pharmacy"})

En realidad, no necesita el escaneo de componentes si tiene su clase principal en la parte superior de la estructura, por ejemplo, directamente debajo del paquete com.pharmacy .

Además, no necesita ambos

@SpringBootApplication @EnableAutoConfiguration

La anotación @SpringBootApplication incluye @EnableAutoConfiguration de forma predeterminada.


También tuve algunos problemas con este tema. Debe asegurarse de definir los paquetes en la clase de corredor de arranque de Spring como en este ejemplo a continuación:

@SpringBootApplication @EnableAutoConfiguration @ComponentScan({"controller", "service"}) @EntityScan("entity") @EnableJpaRepositories("repository") public class Application { public static void main(String[] args){ SpringApplication.run(Application.class, args); }

¡Espero que esto ayude!


Tuve los mismos problemas con el repositorio no se encuentra. Entonces, lo que hice fue mover todo en 1 paquete. Y esto funcionó, lo que significa que no había nada de malo en mi código. Moví Repos y entidades a otro paquete y agregué lo siguiente a la clase SpringApplication.

@EnableJpaRepositories("com...jpa") @EntityScan("com...jpa")

Después de eso, moví el Servicio (interfaz e implementación) a otro paquete y agregué lo siguiente a la clase SpringApplication.

@ComponentScan("com...service")

Esto resolvió mis problemas.


Tuve un problema similar cuando recibía NoSuchBeanDefinitionException en Spring Boot (básicamente mientras trabajaba en el repositorio de CRUD), tuve que poner las anotaciones a continuación en la clase principal:

@SpringBootApplication @EnableAutoConfiguration @ComponentScan(basePackages={"<base package name>"}) @EnableJpaRepositories(basePackages="<repository package name>") @EnableTransactionManagement @EntityScan(basePackages="<entity package name>")

Además, asegúrese de tener las anotaciones @Component en su lugar en las implementaciones.


Tuve un problema similar pero con una causa diferente:

En mi caso, el problema fue que en la interfaz que define el repositorio

public interface ItemRepository extends Repository {..}

Estaba omitiendo los tipos de la plantilla. Ajustándolos bien:

public interface ItemRepository extends Repository<Item,Long> {..}

Hizo el truco.