2015-12-11 59 views
0

我嘗試使用mailsender發送電子郵件。爲了初始化mailSender,我試圖使用@Service和@Autowired,它說mailSender爲null;然後我嘗試使用getter和setter,它說mailSender也是null。mailSender屬性在spring bean中是null(自動裝配和setter都不工作)

我認爲這可能是一個普遍的spring bean問題,但我遵循在線教程來設置屬性。我的代碼有什麼問題?

public class Test { 
    private org.springframework.mail.MailSender mailSender; 

    public org.springframework.mail.MailSender getMailSender() { 
     return mailSender; 
    } 

    public void setMailSender(org.springframework.mail.MailSender mailSender) { 
     this.mailSender = mailSender; 
    } 

    public void send() { 
     SimpleMailMessage message = new SimpleMailMessage(); 

     message.setFrom(MyFrom); 
     message.setTo(MyTo); 
     message.setSubject("test"); 
     message.setText("test"); 
     mailSender.send(message); 
    } 
} 

和下面是我的beans.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://cxf.apache.org/jaxrs 
    http://cxf.apache.org/schemas/jaxrs.xsd"> 

    <mvc:annotation-driven validator="validator" /> 
    <bean id="validator"  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
     <property name="host" value="smtp.gmail.com" /> 
     <property name="port" value="587" /> 
     <property name="username" value="username" /> 
     <property name="password" value="password" /> 

     <property name="javaMailProperties"> 
      <props> 
       <prop key="mail.smtp.auth">true</prop> 
       <prop key="mail.smtp.starttls.enable">true</prop> 
      </props> 
     </property> 
    </bean> 
    <bean id="mailMail" class="study.hard.Test"> 
     <property name="mailSender" ref="mailSender" /> 
    </bean> 

</beans> 

以下是類調用test.send();

public class ProjectdMonitor { 
    public void alert() { 
     Test test = new Test(); 
     test.send(); 
    } 
} 
+0

你怎麼驗證? send()方法被調用的地方在哪裏?你可以發佈相關代碼片段 –

+0

在我的其他課程中,我有一個提醒功能(請參閱編輯)。我在我的項目中使用Quartz。石英工作將每小時調用一次alert()。 –

+2

你不能做新的Test(); ...春天不知道新的物體,所以它不會做任何你期望的事情。相反,你必須從Spring應用程序上下文中得到你的測試對象id爲「mailMail」,然後調用send() –

回答

1

您正在使用new運算符來創建bean,而spring並不知道這個新創建的bean。因此,mailSender屬性將爲空。

在以下代碼中,我們從Spring應用程序上下文中獲取Test bean,而不是使用new運算符創建。由於它是從Spring應用程序上下文獲得的,因此所有自動裝配都會發生。

嘗試以下操作:

public static void main(String args[]){ 
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
    Test test = context.getBean("mailMail", Test.class); 
    test.send(); 
} 
相關問題