我有一个简单的 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 运行?
问题是您使用了不兼容的库。
<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
。