You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot实现邮件发送时出现NullPointerException空指针异常如何解决

异常原因分析

本次空指针异常触发在SpringEmailDemoApplication.java第20行的senderService1.sendEmail()调用位置,说明此时senderService1未被Spring成功注入,值为null,核心原因通常是以下两点:

  • EmailSenderService未被Spring容器扫描注册为Bean:@SpringBootApplication默认仅扫描启动类所在包及其子包下的带Spring注解的类,如果你写的EmailSenderService不在com.sumitcodes.SpringEmailDemo包或它的子包下,就算加了@Service注解也不会被容器识别,自然无法完成注入。
  • 特殊注入时机冲突:@EventListener(ApplicationReadyEvent.class)理论上在容器完全启动后触发,但小概率场景下会出现字段注入未完成就触发事件的问题。
定位步骤
  1. 验证注入结果:在sendMail方法第一行加打印语句输出senderService1的值,确认是否为null;同时可以在EmailSenderService的无参构造方法中加打印日志,观察程序启动时这个类是否被Spring实例化。
  2. 核对包路径:检查EmailSenderService的包名是否属于启动类com.sumitcodes.SpringEmailDemo包的子包,比如com.sumitcodes.SpringEmailDemo.service符合要求,com.sumitcodes.service就不在默认扫描范围内。
  3. 排查启动日志:查看程序启动日志中是否有Bean注入失败的警告,或者EmailSenderService相关的注册日志。
解决方案

优先解决包扫描问题

  • 方案一:调整EmailSenderService的存放路径,放到启动类所在包的子包下,适配Spring默认扫描规则。
  • 方案二:如果不想调整路径,直接在启动类上新增@ComponentScan注解手动指定扫描范围,示例:
@SpringBootApplication
@ComponentScan(basePackages = {"com.sumitcodes.SpringEmailDemo", "EmailSenderService所在的完整包路径"})
public class SpringEmailDemoApplication {
    // 原有代码
}

优化注入和触发逻辑(可选,可规避时机问题)

改用构造注入+ApplicationRunner的方式实现启动后发邮件的逻辑,比字段注入+事件监听的稳定性更高,代码示例:

@SpringBootApplication
public class SpringEmailDemoApplication implements ApplicationRunner {

    private final EmailSenderService senderService1;

    // Spring 4.3+ 同类型单实例Bean不需要加@Autowired注解
    public SpringEmailDemoApplication(EmailSenderService senderService1) {
        this.senderService1 = senderService1;
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringEmailDemoApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        senderService1.sendEmail("XYZ@gmail.com",
                "Spring boot Email sender",
                "Hi How are you.");
    }
}

额外提醒:本问题解决后还需要确认两点,避免后续出现其他错误:

  1. 项目依赖中是否引入了spring-boot-starter-mail启动器,没有的话JavaMailSender无法自动配置
  2. application.properties/yml中是否配置了正确的SMTP邮件参数,以Gmail为例配置参考:
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=ABC@gmail.com
spring.mail.password=你的谷歌账号应用专用密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

内容的提问来源于stack exchange,提问作者Sumi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:54:02