[親測]完美解決SpringBoot郵件發送 注入JavaMailSenderImpl時出現NullPointerException空指針異常

一、問題描述

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章