[SPRING] @Autowire가 @Repository로 실패했습니다.
SPRING@Autowire가 @Repository로 실패했습니다.
@Repository 주석이 달린 클래스로 @Autowire 주석을 만들 수 없습니다.
인터페이스가 있습니다.
public interface AccountRepository {
public Account findByUsername(String username);
public Account findById(long id);
public Account save(Account account);
}
@Repository로 주석 된 인터페이스를 구현하는 클래스 :
@Repository
public class AccountRepositoryImpl implements AccountRepository {
public Account findByUsername(String username){
//Implementing code
}
public Account findById(long id){
//Implementing code
}
public Account save(Account account){
//Implementing code
}
}
다른 클래스에서는이 저장소를 사용하여 사용자 이름으로 계정을 찾을 필요가 있으므로 autowiring을 사용하고 있지만 작동하는지 accountRepository 인스턴스가 항상 null인지 확인하려고합니다.
@Component
public class FooClass {
@Autowired
private AccountRepository accountRepository;
...
public barMethod(){
logger.debug(accountRepository == null ? "accountRepository is NULL" : "accountRepository IS NOT NULL");
}
}
패키지 (예 : sessionFactory.setPackagesToScan (new String [] { "com.foo.bar"});)를 검사하도록 패키지를 설정했으며 인스턴스에 @Component로 주석 된 다른 클래스를 자동 작성하지만이 패키지에서는 @Repository로 주석 된 경우 항상 null입니다.
내가 놓친 게 있니?
해결법
-
==============================
1.당신의 문제는 당신이 콩을 새로운 것으로 인스턴스화하는 것이 가장 쉽기 때문에 Spring은 그것을 인식하지 못합니다. 대신 빈을 삽입하거나 @Configurable 빈을 만들고 AspectJ를 사용한다.
당신의 문제는 당신이 콩을 새로운 것으로 인스턴스화하는 것이 가장 쉽기 때문에 Spring은 그것을 인식하지 못합니다. 대신 빈을 삽입하거나 @Configurable 빈을 만들고 AspectJ를 사용한다.
-
==============================
2.Spring 애노테이션을 활성화하도록 구성하지 않은 것 같습니다. 주석을 스캔하는 구성 요소를 살펴 보는 것이 좋습니다. 예를 들어 Java 구성 응용 프로그램의 경우 :
Spring 애노테이션을 활성화하도록 구성하지 않은 것 같습니다. 주석을 스캔하는 구성 요소를 살펴 보는 것이 좋습니다. 예를 들어 Java 구성 응용 프로그램의 경우 :
@ComponentScan(basePackages = { "com.foo" })
... 또는 XML 설정 :
<context:annotation-config /> <context:component-scan base-package="com.foo" />
FooClass가 해당 구성에 정의 된 기본 패키지 아래에 있지 않으면 @Autowired는 무시됩니다.
추가 포인트로 @Autowired (required = true)를 사용하는 것이 좋습니다. 이는 응용 프로그램이 NullPointerException을 throw 할 때까지 기다리지 않고 시작시 실패하게됩니다. 그러나 주석을 구성하지 않으면 실패하지 않습니다.
JUnit 테스트를 사용하여 autowiring이 올바르게 수행되고 있는지 테스트해야한다.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( classes = MyConfig.class, loader = AnnotationConfigContextLoader.class) public class AccountRepositoryTest { @Autowired private AccountRepository accountRepository; @Test public void shouldWireRepository() { assertNotNull(accountRepository); } }
기본 구성이 올바른지 여부를 나타내야합니다. 다음 단계는 이것이 웹 애플리케이션으로 배치된다고 가정하고, web.xml 및 foo-servlet.xml 구성에 올바른 비트와 조각을 넣어 봄 초기화를 트리거하는지 확인하는 것입니다.
-
==============================
3.Foo Class는 자신의 부름을 관리하기 위해 Spring에 의해 인스턴스화되어야합니다. Food Class가 bean (@Component 또는 @Service annotation 또는 XML 선언)과 같은 인스턴스인지 확인하십시오.
Foo Class는 자신의 부름을 관리하기 위해 Spring에 의해 인스턴스화되어야합니다. Food Class가 bean (@Component 또는 @Service annotation 또는 XML 선언)과 같은 인스턴스인지 확인하십시오.
편집 : sessionFactory.setPackagesToScan은 JPA / Hibernate 주석을 찾고있는 반면 @Repository는 Spring Context 주석입니다. AccountRepositoryImpl은 Spring 구성 요소 스캔 범위에 있어야합니다.
문안 인사,
from https://stackoverflow.com/questions/19856241/autowire-failing-with-repository by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 웹 소켓 : 오프라인 사용자에게 메시지 보내기 - 메시지 브로커에 대기열에 포함되지 않은 메시지 (0) | 2019.05.13 |
---|---|
[SPRING] Hibernate에서 '@'문자로 어려움을 겪고있는 Hibernate (0) | 2019.05.13 |
[SPRING] Spring RestTemplate는 get리스트를 보냅니다. (0) | 2019.05.13 |
[SPRING] Eclipse에서 applicationcontext.xml을 구성하는 방법 (0) | 2019.05.13 |
[SPRING] Spring 데이터 REST : MongoDB 저장소에 대한 커스텀 질의 (0) | 2019.05.13 |