一、问题描述
近日在做邮件发送功能时 莫名其妙的出现了NullPointerException空指针异常
代码在测试的时候完全正常 但封装成工具类再调用的时候就报错
在解决的过程中也查找过很多相关资料 但帮助不是很大
有个方法是添加@PostConstruct注解然后初始化 但是并没有作用
还有个方法是新建一个普通类 确实能解决部分问题(如果你不是用Thymeleaf模板发送的话)
将
@Autowired
private static JavaMailSenderImpl javaMailSender;
改为
public static JavaMailSenderImpl JavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("邮件服务器");
mailSender.setUsername("发件人邮箱");
mailSender.setPassword("SMTP密码");
return mailSender;
}
但我在邮件里需要发送Thymeleaf页面 因此需要注入TemplateEngine
随后 在用该方法注入TemplateEngine的时候:
public static TemplateEngine TemplateEngine()
{
TemplateEngine templateEngine=new TemplateEngine();
return templateEngine;
}
在解析模板页面的时候直接发送了字符串
比如:
templateEngine.process("mailTemplate",context);
邮件里直接发送了"mailTemplate"字符串 根本不是我要发送的页面内容 这谁顶得住呀😣
因此 该方法也被否决了
这个问题研究一整天了 然而 在我的努力下 终于在无意间成功解决了😁
二、解决方法
-
一、我在邮件发送工具类里给注入的JavaMailSenderImpl加上了static 这个static必须去掉
因为静态方法是属于类的 普通方法才是属于实体对象(即New出来的对象)的
spring注入是在容器中实例化对象 所以不能使用静态方法 -
二、要给工具类加上
@Component
注解
用@autowired注入JavaMailSenderImpl后 将整个类交给了Spring管理
因此类上必须加@Component
在调用该工具类的时候也要用@Autowired
注入
因此 最终的工具类代码是这样的:
@Component // 要加@Component注解
public class MailUtil {
@Autowired
private JavaMailSenderImpl javaMailSender;
@Autowired
private TemplateEngine templateEngine;
public void sendTemplateMail() throws MessagingException, UnsupportedEncodingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(new InternetAddress("发件人邮箱","发件人昵称","UTF-8"));
// 收件人邮箱
mimeMessageHelper.setTo("收件人邮箱");
mimeMessageHelper.setSubject("邮件标题");
Context context=new Context();
// 收件人昵称
context.setVariable("nickname","陈涛");
String content=templateEngine.process("mailTemplate",context);
// true表明为HTML格式邮件
mimeMessageHelper.setText(content, true);
javaMailSender.send(mimeMessage);
}
}
mailTemplate.html 模板页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div th:text="${nickname}+',您好'"></div>
</body>
</html>
测试:
@SpringBootTest
@RunWith(SpringRunner.class)
public class VueBlogApplicationTests {
@Autowired // 要先注入
private MailUtil mailUtil;
@Test
public void test() throws UnsupportedEncodingException, MessagingException {
mailUtil.sendTemplateMail();
}
}