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生态不兼容,这才引发了后续的类加载冲突。
解决步骤
移除
javax.activation-api依赖
直接删掉pom.xml(或build.gradle)中你手动添加的该依赖。Spring Boot 3的spring-boot-starter-mail已经自带适配Jakarta版本的Activation相关依赖,无需手动引入旧版本。确认邮件依赖版本(可选检查)
确保你的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>验证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清理缓存并重新构建
执行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
相关产品推荐
相关产品推荐

