Spring 3.1:MIME 生成问题 - 适用于 Spring 2.7

问题描述 投票:0回答:1

我有一个简单的 Spring-Boot 应用程序,可以生成 MIME 结构。 我这样做是为了在一个简单的组件 MyComp 中进行测试。

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.annnotation.*  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 时它工作正常(最高 Spring Boot 2 编号 2.7.18)。

<?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>

如果我更改为 Spring-Boot 3.1.11,它会失败并出现异常

mm.writeTo (baos);

例外情况是:MIME 类型 application/soap+xml 没有对象 DCH

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)

知道原因吗?我怎样才能让它在 Spring 3 运行?

java spring-boot mime
1个回答
0
投票

问题是您使用了不兼容的库。

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

这是一个 JavaEE 依赖项,对于 Spring Boot,最好使用

spring-boot-starter-mail
来代替。这将引入所有必要且兼容的依赖项。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

如果您首先转移到该依赖项,您的 2.7 版本仍然可以工作。现在,当升级到 3.1(我建议 3.2)时,您的代码将停止编译。 Spring Boot 3 需要从 JavaEE 迁移到 JakartaEE。这意味着您需要将代码中的

javax.mail
导入更改为
jakarta.mail

© www.soinside.com 2019 - 2024. All rights reserved.