У меня есть простое приложение 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);
Исключением является отсутствие объекта DCH для приложения типа MIME/мыло+xml.
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?
Спасибо, это сделало свою работу. Пожалуйста, ответьте, и я могу отдать должное!
Когда вы имеете в виду Spring Boot, напишите Spring Boot. Spring в настоящее время находится на версии 6. что-то, 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 требует перехода на JakartaEE с JavaEE. Это означает, что вам нужно изменить импорт javax.mail
на jakarta.mail
в вашем коде.
Ваш код предназначен для JavaEE, а Spring Boot 3+ — для JakaratEE. Поэтому, если вы не измените свой код, чтобы он соответствовал требованиям JakartaEE, он не будет работать. Вероятно, вам пришлось добавить некоторые дополнительные зависимости (несовместимые), чтобы он вообще скомпилировался. Удалите эти зависимости и вместо этого исправьте импорт. Удалите
javax.mail
и замените наspring-boot-starter-mail
, затем обновите и исправьте ошибки компиляции (не добавляя несовместимые зависимости, а изменяя импорт).