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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:05:54