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

Spring Boot API发邮件遇两类异常,求解决方案

Spring Boot 3.1.3 邮件发送的Activation类冲突解决办法

问题根源

Spring Boot 3.x 基于Jakarta EE 9+,所有原javax.*命名空间的API已完全迁移到jakarta.*。你手动添加的javax.activation-api是Java EE时代的旧依赖,和Spring Boot 3的Jakarta生态不兼容,这才引发了后续的类加载冲突。

解决步骤

  1. 移除javax.activation-api依赖
    直接删掉pom.xml(或build.gradle)中你手动添加的该依赖。Spring Boot 3的spring-boot-starter-mail已经自带适配Jakarta版本的Activation相关依赖,无需手动引入旧版本。

  2. 确认邮件依赖版本(可选检查)
    确保你的spring-boot-starter-mail为3.1.3版本,它会自动引入jakarta.mail:jakarta.mail-api和com.sun.mail:jakarta.mail(包含Jakarta Activation的实现),完全覆盖邮件发送所需的类。

    Maven依赖示例:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>3.1.3</version>
    </dependency>
    
  3. 验证Gmail配置正确性
    确保application.properties中的SMTP配置符合Gmail要求,注意需使用Gmail应用专用密码(而非原账号密码):

    spring.mail.host=smtp.gmail.com
    spring.mail.port=587
    spring.mail.username=你的邮箱@gmail.com
    spring.mail.password=你的Gmail应用专用密码
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    
  4. 清理缓存并重新构建
    执行mvn clean install(Maven)或gradle clean build(Gradle),清理旧依赖缓存,确保所有依赖均为Jakarta版本。

错误原因解析

  • 第一个ClassNotFoundException:Spring Boot 3默认不包含javax.activation包,因为已全面切换为jakarta.activation,所以找不到旧包类是正常现象。
  • 第二个ClassCastException:添加javax.activation-api后,类加载器同时加载了新旧两个版本的DataContentHandler接口,而Geronimo的TextHandler实现的是Jakarta版本的接口,强制转换为javax版本接口时自然报错。

内容的提问来源于stack exchange,提问作者Juan C Rosero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:35:02