Spring Boot 3.1生成MIME结构报错,2.7版本正常求解决
问题描述
我有一个生成MIME结构的简单Spring Boot应用,通过组件MyComp实现测试逻辑。该代码在Spring Boot 2.7.18版本下运行正常,但升级至Spring Boot 3.1.11后,执行mm.writeTo(baos)代码时抛出异常:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/soap+xml
相关代码
package com.example.demo; import java.io.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; import org.slf4j.*; import org.springframework.stereotype.*; import javax.annotation.*; // change to jakarta.annotation.* if Spring Boot 3 @Component public class MyComp { @PostConstruct private void init () { try { Properties ps = new Properties (); Session ses = Session.getInstance (ps); MimeMessage mm = new MimeMessage (ses); Multipart mp = new MimeMultipart ("related"); MimeBodyPart mbp = new MimeBodyPart (); mbp.setContent ("abc", "application/soap+xml"); mbp.setHeader ("Content-Transfer-Encoding", "binary"); mbp.setHeader ("Content-Disposition", "inline"); mbp.setContentID ("<mimepart_head>"); mp.addBodyPart (mbp); mm.setContent (mp); mm.saveChanges (); mm.setHeader ("Content-Type", mm.getContentType () + "; start=\"mimepart_head\""); ByteArrayOutputStream baos = new ByteArrayOutputStream (); mm.writeTo (baos); // 报错行 System.out.println(baos.toString()); } catch (Exception e) { System.out.println (e.getMessage()); } } }
Spring Boot 2.7.18的Maven配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <builder>paketobuildpacks/builder-jammy-base:latest</builder> </image> </configuration> </plugin> </plugins> </build> </project>
异常栈信息
Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/soap+xml at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:885) at javax.activation.DataHandler.writeTo(DataHandler.java:316) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1694) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:996) at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:561) at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:84) at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:883) at javax.activation.DataHandler.writeTo(DataHandler.java:316) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1694) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1887) at com.example.demo.MyComp.init(MyComp.java:70)
报错原因
- Jakarta EE API迁移不兼容:Spring Boot 3.x基于Jakarta EE 9+,所有原Java EE的
javax.*命名空间API(如javax.mail、javax.activation)都已迁移到jakarta.*。你仍使用旧的javax.mail依赖,导致类加载和API调用冲突。 - DCH自动注册失效:旧版本
javax.activation的内容处理器(DCH)在Spring Boot 3的模块化类加载环境下,无法自动扫描注册application/soap+xml类型的处理器,而Spring Boot 2的类路径机制允许自动加载。
解决方案
1. 替换为Jakarta Mail依赖
将Maven中的javax.mail依赖替换为Jakarta版本,Spring Boot 3的parent已内置版本管理,无需手动指定版本:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> </dependency>
2. 修改代码中的包导入
将所有javax.*相关的导入替换为jakarta.*:
// 替换前 import javax.mail.*; import javax.mail.internet.*; import javax.annotation.*; // 替换后 import jakarta.mail.*; import jakarta.mail.internet.*; import jakarta.annotation.*;
3. 手动注册DCH(可选)
如果替换依赖后仍报错,可在init()方法开头手动注册application/soap+xml的内容处理器:
try { MailcapCommandMap commandMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); // 复用文本处理器处理SOAP XML类型 commandMap.addMailcap("application/soap+xml;; x-java-content-handler=com.sun.mail.handlers.text_plain"); CommandMap.setDefaultCommandMap(commandMap); } catch (Exception e) { e.printStackTrace(); }
4. 更新Spring Boot Parent版本
确保Maven配置中的Spring Boot Parent版本为3.1.11:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.11</version> <relativePath/> </parent>
内容的提问来源于stack exchange,提问作者chris01
相关产品推荐
相关产品推荐

