Spring Boot 3.1: проблема с созданием MIME - работает в Spring Boot 2.7

У меня есть простое приложение 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?

Ваш код предназначен для JavaEE, а Spring Boot 3+ — для JakaratEE. Поэтому, если вы не измените свой код, чтобы он соответствовал требованиям JakartaEE, он не будет работать. Вероятно, вам пришлось добавить некоторые дополнительные зависимости (несовместимые), чтобы он вообще скомпилировался. Удалите эти зависимости и вместо этого исправьте импорт. Удалите javax.mail и замените на spring-boot-starter-mail, затем обновите и исправьте ошибки компиляции (не добавляя несовместимые зависимости, а изменяя импорт).

M. Deinum 02.05.2024 16:02

Спасибо, это сделало свою работу. Пожалуйста, ответьте, и я могу отдать должное!

chris01 02.05.2024 16:27

Когда вы имеете в виду Spring Boot, напишите Spring Boot. Spring в настоящее время находится на версии 6. что-то, Spring 3 древний.

Sören 02.05.2024 17:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы используете несовместимые библиотеки.

<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 в вашем коде.

Другие вопросы по теме