mailSender 属性 在 spring bean 中为空(自动装配和 setter 都不起作用)
mailSender property is null in spring bean (both autowired and setter dont work)
我尝试使用mailsender 发送电子邮件。为了初始化mailSender,我尝试使用@Service和@Autowired,它说mailSender是空的;然后我尝试使用 getter 和 setter,它说 mailSender 也是空的。
我认为这可能是一个普遍的 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>
下面是class调用test.send();
public class ProjectdMonitor {
public void alert() {
Test test = new Test();
test.send();
}
}
您正在使用 new 运算符创建 bean,并且 spring 不知道这个新创建的 bean。因此 mailSender 属性 将为空。
在下面的代码中,我们从 spring 应用程序上下文中获取测试 bean,而不是使用 new 运算符创建。因为它是从 spring 应用程序上下文中获得的,所以所有的自动装配都会发生。
尝试以下操作:
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Test test = context.getBean("mailMail", Test.class);
test.send();
}
我尝试使用mailsender 发送电子邮件。为了初始化mailSender,我尝试使用@Service和@Autowired,它说mailSender是空的;然后我尝试使用 getter 和 setter,它说 mailSender 也是空的。
我认为这可能是一个普遍的 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>
下面是class调用test.send();
public class ProjectdMonitor {
public void alert() {
Test test = new Test();
test.send();
}
}
您正在使用 new 运算符创建 bean,并且 spring 不知道这个新创建的 bean。因此 mailSender 属性 将为空。
在下面的代码中,我们从 spring 应用程序上下文中获取测试 bean,而不是使用 new 运算符创建。因为它是从 spring 应用程序上下文中获得的,所以所有的自动装配都会发生。
尝试以下操作:
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Test test = context.getBean("mailMail", Test.class);
test.send();
}