복붙노트

[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. ==============================

    1.당신의 문제는 당신이 콩을 새로운 것으로 인스턴스화하는 것이 가장 쉽기 때문에 Spring은 그것을 인식하지 못합니다. 대신 빈을 삽입하거나 @Configurable 빈을 만들고 AspectJ를 사용한다.

    당신의 문제는 당신이 콩을 새로운 것으로 인스턴스화하는 것이 가장 쉽기 때문에 Spring은 그것을 인식하지 못합니다. 대신 빈을 삽입하거나 @Configurable 빈을 만들고 AspectJ를 사용한다.

  2. ==============================

    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. ==============================

    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 구성 요소 스캔 범위에 있어야합니다.

    문안 인사,

  4. from https://stackoverflow.com/questions/19856241/autowire-failing-with-repository by cc-by-sa and MIT license