2017-12-06 25 views
0

이 문제와 관련된 다른 질문을 본 적이 있지만 그 중 누구도 실제로 내 문제에 도움이되지 않습니다.autowire 할 수 없습니다. 'MessagingPropertiesRefactor'유형의 빈을 찾지 못했습니다.

나는 내 테스트 클래스에서 정의한 두 가지 속성을가집니다.

@Autowired 
    private MessagingProperties messagingProperties; 

    @Autowired 
    private MessagingPropertiesRefactor messagingPropertiesRefactor; 

나는 의 새 버전 MessagingProperties.java을 만들려고하고 있습니다. 기본적으로이 클래스를 복사하고 새 파일 MessagingPropertiesRefactor.java (동일한 패키지/디렉터리)을 만들고 동일한 코드를 붙여 넣습니다. 클래스 정의 등을 변경했지만, 대부분 동일합니다.

IntelliJ 디자인 타임 컴파일러 오류가 발생합니다. "자동 응답 할 수 없습니다. ''MessagingPropertiesRefactor '유형의 빈을 찾을 수 없습니다."

그런 다음 원래 클래스의 모든 단일 사용을 검색하여 어딘가에 선언되었지만 아무것도 발견하지 못했는지 다시 확인합니다.

저는 Java (및 Spring)에 "새로운"버전입니다. 누구도 이전에 같은 문제에 부딪 혔습니까?

+0

리팩토링 된 클래스에 '@ Component' 주석이 있습니까? 그렇지 않다면 beans.xml 파일이나 AppConfig 클래스 파일에이 클래스의 bean을 선언해야합니다. – eladyanai

답변

0

MessagingProperties에있는 모든 주석을 MessagingPropertiesRefactor에 적용했는지 확인하십시오. 있다면, xml 설정에서 MessagingProperties이라는 Bean 정의를 찾아서 복사하십시오.

1

MessagingPropertiesRefactor가 @Component로 주석되지 새 클래스를 사용하면 하나 같은 beans.xml 환경에 선언있어 경우이 같은

<beans> 
    <bean name="messagingPropertiesRefactor" class="com.package.path.MessagingPropertiesRefactor"/> 
</beans> 

또는 AppConfig.java에서 :

@Configuration 
public class AppConfig { 
    @Bean 
    public MessagingPropertiesRefactor messagingPropertiesRefactor() { 
     return new MessagingPropertiesRefactor(); 
    } 
} 

Source Reference

,
1

당신이 테스트에서 봄 의존성 주입을 적용 할 경우, 당신은이 기본 옵션이 있습니다 당신은 XML에 선언 된 콩이 XML 파일에 모두 MessagingPropertiesMessagingPropertiesRefactor을 선언하고 테스트를 주석하려면

  1. 을 다음과 같은 방법으로 클래스를 분류하십시오.

    @RunWith(SpringRunner.class)  
    @ContextConfiguration("your.xml") 
    

    빈들은 성공적으로 autowired되어야합니다.

  2. 는 다음

    2.1을, JavaConfig에서 선언 된 콩을합니다. 다음과 같이 테스트 클래스에 주석을 답니다 :

    2.2.

    @Configuration  
    static class Config { 
    
        @Bean 
        public MessagingProperties messagingProperties() { 
         // Assuming MessagingProperties has default ctor. 
         return new MessagingProperties(); 
        } 
    
        // Same for MessagingPropertiesRefactor 
    } 
    


    이 *는 config 클래스는 테스트 클래스에 중첩 할 필요가 없습니다 :)이 autowire가 콩을 즐기십시오 : 테스트 클래스 내부, 당신이 필요로하는 콩을 declates 그 컨텍스트 구성 클래스를 정의합니다.

이 주제에 대한 자세한 내용은 스프링 설명서 : https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-javaconfig, 3.5.4 장을 참조하십시오. 컨텍스트 관리.

0

그래서 나는 그것을 "빈"으로 만드는 "마술"코드 줄을 발견했습니다.

@EnableConfigurationProperties({MessagingProperties.class, MessagingPropertiesRefactor.class}) 
public class MessagingConfiguration { 

@Autowired 
    private MessagingProperties messagingProperties; 

@Autowired 
    private MessagingPropertiesRefactor messagingProperties; 

그래서이 클래스를 @EnableConfigurationProperties 속성에 추가하면됩니다. 그런 다음 @Autowired 특성을 사용하여 anywere를 사용할 수 있습니다.

지금 ... 왜, 또는 어떻게, (내가 말했듯이, 나는 "새로운"자바에 이른다) 나는 이것을 정교하게 생각한다.

+0

클래스'MessagingPropertie'와'MessagingPropertiesRefactor'는'@ ConfigurationProperties'로 주석 처리되어 있습니까? 그렇다면 마술은 없습니다 :) 주석'@ EnableConfigurationProperties'가 말했듯이, 당신은 그것들을 가능하게했습니다. 즉, Bean으로 등록했습니다. – PresentProgrammer

+0

그러나 ConfigurationProperties를 autowire하는 것은 좋은 방법으로 보이지 않습니다. bean을 autowire하고 "정상적인"객체처럼 그들과 함께 작업하는 기술, 즉 명백하게 그들의 메소드를 호출하는 기술을 찾고 있다면, 대답에서 제안 된 해결책 중 하나를 적용하는 것이 더 나을 것입니다. 당신의 사건은 구체적 일지 모르지만 그 질문에서 분명하지 않습니다. – PresentProgrammer