Spring Boot에서 @Repository 주석이 달린 인터페이스를 Autowire 할 수 없습니다.


80

저는 스프링 부트 애플리케이션을 개발 중이며 여기서 문제가 발생하고 있습니다. @Repository 주석이 달린 인터페이스를 주입하려고하는데 전혀 작동하지 않는 것 같습니다. 이 오류가 발생합니다.

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

내 코드는 다음과 같습니다.

주요 애플리케이션 클래스 :

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);
    }
}

엔티티 클래스 :

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;

}

저장소 인터페이스 :

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>{

}

제어 장치:

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

심지어 내 코드를 Accessing data jpa 와 비교 했는데이 코드의 문제점 에 대한 아이디어가 부족합니다. 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

수정 됨 : 위와 같이 제안 된대로 코드를 변경했는데 @Repository 인터페이스를 다른 구성 요소에 삽입 할 때 오류가 발생하지 않습니다. 그러나 지금 문제가 있습니다. 구성 요소를 검색 할 수 없습니다 (디버깅을 사용했습니다). 스프링이 내 구성 요소를 찾을 수 없도록 내가 뭘 잘못하고 있습니까?


또 다른 컴포넌트를 생성하고 여기에 'UserEntityDao userEntityDao'를 삽입하면 어떨까요? (또한 참고 : 종속성을 필드에 직접 주입하지 말고 적절한 인수 및 @ Autowired / @ Inject와 함께 생성자를 사용하십시오).
Rafal G.

답변:


168

저장소 패키지가 @SpringBootApplication/ @EnableAutoConfiguration과 다른 경우의 기본 패키지를 @EnableJpaRepositories명시 적으로 정의해야합니다.

@EnableJpaRepositories("com.pharmacy.persistence.users.dao")SpringBootRunner 에 추가하십시오


4
조금 오래되었지만 Application 클래스에 @EnableJpaRepositories를 추가하면 트릭이 발생했습니다.
Hatem Jaber 2015 년

4
이상한 문서는 "기본적으로 Spring Boot는 JPA 저장소 지원을 활성화하고 @SpringBootApplication이있는 패키지 (및 하위 패키지)를 찾습니다."라고 말합니다. spring.io/guides/gs/accessing-data-jpa
magulla

4
@magulla : OP @SpringBootApplication는 패키지 com.pharmacy.config에 있지만 @EnableJpaRepositories위치는com.pharmacy.persistence.users.dao
hang321

28
나는 이와 같은 문제가 있었다. 리포지토리에 대한 패키지를 지정하면 다른 오류가 발생했습니다 Entity is not a managed type. 다른 사람이이 문제를 가지고 들어, 당신은 또한 주석을 추가 할 필요가@EntityScan("com.package.dtos")
c.dunlap

2
MongoDB 저장소의 경우 추가@EnableMongoRepositories("...")
Omid

41

Repository가 발견되지 않는 것과 동일한 문제가 발생했습니다. 그래서 제가 한 일은 모든 것을 하나의 패키지로 옮기는 것이 었습니다. 그리고 이것은 내 코드에 아무런 문제가 없다는 것을 의미합니다. Repos & Entities를 다른 패키지로 옮기고 SpringApplication 클래스에 다음을 추가했습니다.

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

그 후 Service (인터페이스 및 구현)를 다른 패키지로 이동하고 SpringApplication 클래스에 다음을 추가했습니다.

@ComponentScan("com...service")

이것은 내 문제를 해결했습니다.


3
이것은 완전한 문제를 해결하기 때문에 실제로 답이되어야합니다. 그것은주기 때문에 not mapped type단지 추가 한 후 오류@EnableJpaRepositories
아 디트 Peshave을

25

이 유형의 문제에 대한 또 다른 원인은 내가 공유하고 싶은 또 다른 원인이 있습니다. 왜냐하면 나는이 문제에서 한동안 어려움을 겪고 그래서 대답을 찾을 수 없기 때문입니다.

다음과 같은 저장소에서 :

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

}

당신의 실체가있는 경우 UserEntity 가없는@Entity 클래스에 주석을, 당신은 같은 오류가있을 것이다.

이 오류는이 경우에 혼란 스럽습니다. Spring에 대한 문제를 해결하는 데 초점을 맞추고 Repository를 찾지 못했지만 문제는 엔티티이기 때문입니다. 그리고 Repository를 테스트하기 위해이 답변에 도달했다면 이 답변 이 도움 될 수 있습니다.


1
쾅! 작동했습니다! 감사합니다.
sparkyspider

2
좋은 소리! 감사. 나를 위해 redis repo를 사용하고 있었으므로 redish 해시를 정의하면 문제가 해결되었습니다. 예를 들어 @RedisHash (LanguageMapping.KEY_NAME)
theINtoy

16

@ComponentScan주석이 제대로 설정되지 않은 것 같습니다 . 시도해보십시오 :

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

실제로 구조의 맨 위에 기본 클래스가있는 경우 (예 : com.pharmacy패키지 바로 아래) 구성 요소 스캔이 필요하지 않습니다 .

또한 둘 다 필요하지 않습니다.

@SpringBootApplication
@EnableAutoConfiguration

@SpringBootApplication주석이 포함됩니다 @EnableAutoConfiguration기본적으로.


실제로 @ComponentScan("com.pharmacy")해야합니다.
ci_

"구조의 맨 위에 기본 클래스가 있으면 실제로 구성 요소 스캔이 필요하지 않습니다."가 저에게 효과적이었습니다!
Adam

14

나는 NoSuchBeanDefinitionExceptionSpring Boot (기본적으로 CRUD 저장소에서 작업하는 동안)에서 수신하는 비슷한 문제가 있었으며 기본 클래스에 아래 주석을 넣어야했습니다.

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

또한 @Component구현에 주석 이 있는지 확인하십시오 .


7

SpringBoot에서 JpaRepository는 기본적으로 자동 활성화되지 않습니다. 명시 적으로 추가해야합니다.

@EnableJpaRepositories("packages")
@EntityScan("packages")

내가 직면했던 것과 같은 문제는 라이브러리 프로젝트에 Repo와 Entity가 있었고 애플리케이션 프로젝트에서 종속성으로 추가되었습니다. App.java에서이를 명시 적으로 활성화해야합니다.
프랜시스 주권

3

여기에 실수가 있습니다. 누군가가 전에 말했듯이 com.pharmacy의 org.pharmacy insted in 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 {

3

위의 답변으로 확장하려면 실제로 EnableJPARepositories 태그에 둘 이상의 패키지를 추가하여 저장소 패키지를 지정한 후에 만 ​​"개체 매핑되지 않음"오류가 발생하지 않도록 할 수 있습니다.

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{

}

3

잘못된 패키지를 스캔하고 있습니다.

@ComponentScan("**org**.pharmacy")

위치 :

@ComponentScan("**com**.pharmacy")

패키지 이름은 org가 아닌 com으로 시작하기 때문입니다.


3
@SpringBootApplication(scanBasePackages=,<youur package name>)
@EnableJpaRepositories(<you jpa repo package>)
@EntityScan(<your entity package>)

Entity class like below 
@Entity
@Table(name="USER")
public class User {

    @Id
    @GeneratedValue

2
이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을. From Review
이중 경고음

2

SpringData MongoDB와 비슷한 문제가 있습니다. 패키지 경로를 추가해야했습니다. @EnableMongoRepositories


1

비슷한 문제가 있었지만 다른 원인이 있습니다.

제 경우에 문제는 저장소를 정의하는 인터페이스에서

public interface ItemRepository extends Repository {..}

템플릿 유형을 생략했습니다. 올바른 설정 :

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

트릭을했다.


대박. 문제를 해결하는 데 도움이되는 유일한 솔루션입니다.
Simran kaur

1

이 주제에 대해서도 몇 가지 문제가있었습니다. 아래 예제와 같이 Spring 부트 러너 클래스에서 패키지를 정의해야합니다.

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {

    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }

이게 도움이 되길 바란다!


1

에서는 패키지 @ComponentScan("org.pharmacy")를 선언 org.pharmacy합니다. 그러나 com.pharmacy패키지 의 구성 요소 .


1

단위 테스트시이 문제가 발생하면 @DataJpaTest 아래에서 해결책을 찾을 수 있습니다.

Spring Boot는 @RepositoryBean을 초기화하지 않습니다.@DataJpaTest . 따라서 아래 두 가지 수정 사항 중 하나를 사용하여 사용 가능하게하십시오.

먼저

사용하다 @SpringBootTest대신 . 그러나 이것은 전체 응용 프로그램 컨텍스트를 부팅합니다.

둘째 (더 나은 솔루션)

아래와 같이 필요한 특정 저장소를 가져옵니다.

@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {

@Autowired
private MyRepository myRepository;

1

가지고있는 패키지와 관련이있을 수 있습니다. 비슷한 문제가있었습니다.

Description:
Field userRepo in com.App.AppApplication required a bean of type 'repository.UserRepository' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

동작:

repository.UserRepository구성에서 ' ' 유형의 Bean을 정의하는 것을 고려하십시오 . "

표준화 된 명명 규칙을 사용하여 리포지토리 파일을 패키지에 넣어 해결했습니다.

e.g. com.app.Todo (for main domain files)

com.app.Todo.repository (for repository files)

그렇게하면 Spring은 저장소를 찾을 곳을 알고 있습니다. :)

도움이 되었기를 바랍니다.


0

있는지 확인 @Service또는 @Component그 자동 와이어를 시도하는 저장소는 당신과 같은 디렉토리에 있지 않습니다 SpringApplication.class. 과 같은 하위 폴더에 있는지 확인하십시오 service/.


0

때때로 Maven 구성에 Lombok 주석 프로세서 종속성을 추가하는 것을 잊었을 때 동일한 문제가 발생했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.