一、問題描述
近日在做郵件發送功能時 莫名其妙的出現了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();
}
}