[SPRING] 스프링 부트에서 @Repository 주석이 달린 인터페이스를 Autowire 할 수 없음
SPRING스프링 부트에서 @Repository 주석이 달린 인터페이스를 Autowire 할 수 없음
저는 스프링 부트 응용 프로그램을 개발 중이며 여기서 문제가 있습니다. @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 인터페이스를 다른 구성 요소에 삽입 할 때 오류가 표시되지 않습니다. 그러나 지금 문제가 있습니다 - 구성 요소를 검색 할 수 없습니다 (디버깅 사용). 봄에 내 구성 요소를 찾을 수 없으므로 내가 뭘 잘못하고 있니?
해결법
-
==============================
1.저장소 패키지가 @ SpringBootApplication / @ EnableAutoConfiguration과 다른 경우 @EnableJpaRepositories의 기본 패키지를 명시 적으로 정의해야합니다.
저장소 패키지가 @ SpringBootApplication / @ EnableAutoConfiguration과 다른 경우 @EnableJpaRepositories의 기본 패키지를 명시 적으로 정의해야합니다.
SpringBootRunner에 @EnableJpaRepositories ( "com.pharmacy.persistence.users.dao")를 추가하십시오.
-
==============================
2.저장소와 관련하여 동일한 문제가 발견되지 않았습니다. 그래서 내가 한 것은 모든 것을 1 개의 패키지로 옮기는 것입니다. 그리고 이것은 내 코드에 아무런 문제가 없다는 것을 의미합니다. Repos & Entities를 다른 패키지로 옮기고 다음을 SpringApplication 클래스에 추가했습니다.
저장소와 관련하여 동일한 문제가 발견되지 않았습니다. 그래서 내가 한 것은 모든 것을 1 개의 패키지로 옮기는 것입니다. 그리고 이것은 내 코드에 아무런 문제가 없다는 것을 의미합니다. Repos & Entities를 다른 패키지로 옮기고 다음을 SpringApplication 클래스에 추가했습니다.
@EnableJpaRepositories("com...jpa") @EntityScan("com...jpa")
그런 다음 Service (인터페이스 및 구현)를 다른 패키지로 옮기고 SpringApplication 클래스에 다음을 추가했습니다.
@ComponentScan("com...service")
이것은 나의 문제점을 해결했다.
-
==============================
3.@ComponentScan 주석이 제대로 설정되지 않은 것 같습니다. 시도해보십시오.
@ComponentScan 주석이 제대로 설정되지 않은 것 같습니다. 시도해보십시오.
@ComponentScan(basePackages = {"com.pharmacy"})
실제로 com.pharmacy 패키지와 같은 구조의 맨 위에 기본 클래스가있는 경우 구성 요소 검사가 필요하지 않습니다.
또한, 둘 다 필요하지 않습니다.
@SpringBootApplication @EnableAutoConfiguration
@SpringBootApplication 주석은 기본적으로 @EnableAutoConfiguration을 포함합니다.
-
==============================
4.Spring Boot (기본적으로 CRUD 저장소에서 작업 중)에서 NoSuchBeanDefinitionException을받는 것과 비슷한 문제가 있었지만, 주 클래스에 아래 주석을 추가해야했습니다.
Spring Boot (기본적으로 CRUD 저장소에서 작업 중)에서 NoSuchBeanDefinitionException을받는 것과 비슷한 문제가 있었지만, 주 클래스에 아래 주석을 추가해야했습니다.
@SpringBootApplication @EnableAutoConfiguration @ComponentScan(basePackages={"<base package name>"}) @EnableJpaRepositories(basePackages="<repository package name>") @EnableTransactionManagement @EntityScan(basePackages="<entity package name>")
또한 구현시 @Component 주석을 제자리에 두어야합니다.
-
==============================
5.이 문제에 대한 또 다른 원인은 제가 공유하고 싶은 것입니다. 왜냐하면 저는이 문제를 몇 시간 동안 고민하고 있으며 그에 대한 답을 찾을 수 없었기 때문입니다.
이 문제에 대한 또 다른 원인은 제가 공유하고 싶은 것입니다. 왜냐하면 저는이 문제를 몇 시간 동안 고민하고 있으며 그에 대한 답을 찾을 수 없었기 때문입니다.
다음과 같은 저장소에서 :
@Repository public interface UserEntityDao extends CrudRepository<UserEntity, Long>{ }
엔티티 UserEntity에 클래스에 @Entity 주석이 없으면 동일한 오류가 발생합니다.
이 오류는이 경우에 혼란 스럽습니다. Spring이 저장소를 찾을 수 없지만 문제는 엔티티 인 문제에 초점을 맞추기 때문입니다. 리포지토리 테스트를 위해이 대답을 찾은 경우이 대답이 도움이 될 수 있습니다.
-
==============================
6.다음은 실수입니다. 이전에 누군가가 말했듯이, componentscan에서 com.pharmacy의 org.pharmacy insted를 사용하고 있습니다.
다음은 실수입니다. 이전에 누군가가 말했듯이, componentscan에서 com.pharmacy의 org.pharmacy insted를 사용하고 있습니다.
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 {
-
==============================
7.위의 답변으로 확장하려면 실제로 EnableJPARepositories 태그에 둘 이상의 패키지를 추가 할 수 있으므로 저장소 패키지를 지정하기 만하면 "매핑되지 않은 개체"오류가 발생하지 않습니다.
위의 답변으로 확장하려면 실제로 EnableJPARepositories 태그에 둘 이상의 패키지를 추가 할 수 있으므로 저장소 패키지를 지정하기 만하면 "매핑되지 않은 개체"오류가 발생하지 않습니다.
@SpringBootApplication @EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"}) public class SpringBootApplication{ }
-
==============================
8.잘못된 패키지를 스캔하고 있습니다 : @ComponentScan ( "org.pharmacy")
잘못된 패키지를 스캔하고 있습니다 : @ComponentScan ( "org.pharmacy")
그것이 있어야하는 곳 : @ComponentScan ( "com.pharmacy")
패키지 이름은 org가 아니라 com으로 시작합니다.
-
==============================
9.비슷한 문제가 있었지만 다른 원인이 있습니다.
비슷한 문제가 있었지만 다른 원인이 있습니다.
제 경우에는 저장소를 정의하는 인터페이스에서 문제가있었습니다.
public interface ItemRepository extends Repository {..}
템플릿의 유형을 생략했습니다. 오른쪽 설정 :
public interface ItemRepository extends Repository<Item,Long> {..}
트릭을 했어.
-
==============================
10.이 주제에 대해서도 몇 가지 문제가있었습니다. 아래 예제와 같이 Spring 부트 러너 클래스에서 패키지를 정의해야합니다 :
이 주제에 대해서도 몇 가지 문제가있었습니다. 아래 예제와 같이 Spring 부트 러너 클래스에서 패키지를 정의해야합니다 :
@SpringBootApplication @EnableAutoConfiguration @ComponentScan({"controller", "service"}) @EntityScan("entity") @EnableJpaRepositories("repository") public class Application { public static void main(String[] args){ SpringApplication.run(Application.class, args); }
이게 도움이 되길 바란다!
from https://stackoverflow.com/questions/29221645/cant-autowire-repository-annotated-interface-in-spring-boot by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 업데이트 방법을 호출하지 않고 트랜잭션 저장 (0) | 2018.12.14 |
---|---|
[SPRING] localhost 외에 IP 주소로 요청을 듣기 위해 Spring과 통합 된 임베디드 Tomcat을 구성하는 방법은 무엇입니까? (0) | 2018.12.14 |
[SPRING] Spring @Scheduled 주석이 달린 메서드는 다른 스레드에서 실행됩니까? (0) | 2018.12.14 |
[SPRING] 스프링 배치 데이터와 비즈니스 데이터를위한 별도의 데이터 소스를 java-configure하는 방법은 무엇입니까? 심지어해야합니까? (0) | 2018.12.14 |
[SPRING] @Aspect aspect에 대한 스프링 autowired bean은 null이다. (0) | 2018.12.14 |