2015-12-11 54 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(); 
} 
相关问题