2015-01-06 4 views
0

Spring MVC를 사용하여 bean에 값을 주입하는 데 문제가 있습니다. 빈이 주입하는 것 여기Spring Framework에서 프로퍼티 삽입하기

<beans> 
    <!-- Enable Annotation based configuration --> 
    <context:annotation-config /> 

    <!-- MailGun.org Authentication --> 
    <bean class="com.example.something.util.MailSender"> 
     <property name="smtpHost" value="smtp.mailgun.org" /> 
     <property name="smtpUsername" value="USERNAME_HERE" /> 
     <property name="smtpPassWord" value="PASSWORD_HERE" /> 
    </bean> 
</beans> 

그리고 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:test-spring-context.xml"}) 
public class MailSenderTest { 
    @Test 
    public void testSendMail() { 
     MailSender sender = new MailSender(); 
     sender.sendMail("[email protected]", "Mail From MailGun", "This is a test mail"); 
    } 
} 

:

package com.example.something.util; 

@Component 
public class MailSender { 
    public void sendMail(String recipient, String subject, String text) { 
     System.out.println(smtpHost); 
    } 

    @Autowired 
    private String smtpHost; 
} 

이를 테스트하려면, 내가 테스트 클래스를 생성

여기에 봄의 내 부분적인 구성이다 이 테스트 케이스를 실행하면 예외가 발생합니다.

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.something.util.MailSender.smtpHost; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] 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) 
    ... 41 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] 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:1308) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    ... 43 more 

무엇이 문제입니까? 도와주세요. 고마워!

답변

2

smtpHost@Autowired이 필요하지 않으므로, MailSender 빈을 Spring 컨텍스트에서 가져온 경우 이미 채워 져야합니다. 당신이하지 않는 이유는, new MailSender()으로 인스턴스화하면 스프링을 모두 우회하기 때문입니다. 대신 context.getBean(MailSender.class)을 사용해야합니다.

+0

그러나 나는'context.getBean()'이 우아한 구현이라고 생각하지 않는다. 여기에 특수 효과를 사용할 수 있습니까? –

+0

@HowardShieh는'@Autowired MailSender sender'를 사용하고 메소드에서 초기화하려고 시도하지 않고 테스트 클래스의 필드로 이동합니다. –

+0

@LuiggiMendoza는 테스트가 Spring 컨텍스트에서 실행되기 때문에'@Autowired MailSender sender'를 사용할 수 있다고 말했습니다. –

관련 문제