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.