Как исправить файл, который не прикрепляется к сообщению SAAJ SOAP в Java?

Я пытаюсь создать клиент для веб-службы SOAP. Я читаю запрос из XML-файла в String и преобразовываю его в класс SOAPMessage. Тело SOAP-сообщения состоит из двух элементов, один из которых должен быть вложенным файлом (элемент имеет тег DataFile). Поэтому я создаю AttachmentPart из файла и добавляю его в SOAPMessage. Однако принимающее приложение говорит, что к сообщению не прикреплен файл (DataHandler сообщения == null). Может ли кто-нибудь сказать мне, почему файл не отправляется должным образом вместе с запросом?

Вот запрос SOAP из файла xml:

<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xro = "http://x-road.eu/xsd/xroad.xsd" xmlns:iden = "http://x-road.eu/xsd/identifiers" xmlns:stat = "http://stat-v6.x-road.eu">
   <soapenv:Header>
      <xro:protocolVersion>4.0</xro:protocolVersion>
      <xro:issue></xro:issue>
      <xro:userId>EE700031011</xro:userId>
      <xro:id>123</xro:id>
      <xro:service iden:objectType = "SERVICE">
         <iden:xRoadInstance>ee-test</iden:xRoadInstance>
         <iden:memberClass>GOV</iden:memberClass>
         <iden:memberCode>70000332</iden:memberCode>
         <!--Optional:-->
         <iden:subsystemCode>estat</iden:subsystemCode>
         <iden:serviceCode>SubmitData</iden:serviceCode>
         <!--Optional:-->
         <iden:serviceVersion>v1</iden:serviceVersion>
      </xro:service>
     <xro:client iden:objectType = "SUBSYSTEM"> 
         <iden:xRoadInstance>ee-test</iden:xRoadInstance>
         <iden:memberClass>GOV</iden:memberClass>
         <iden:memberCode>70000332</iden:memberCode>
         <!--Optional:-->
         <iden:subsystemCode>sa-client</iden:subsystemCode>
      </xro:client>
   </soapenv:Header>
   <soapenv:Body>
      <stat:SubmitDataRequest>
         <DataFile>cid:Report.xml</DataFile>
         <XSDValidationOnly>1</XSDValidationOnly>
      </stat:SubmitDataRequest>
   </soapenv:Body>
</soapenv:Envelope>

Report.xml — это файл, который я пытаюсь прикрепить к сообщению SOAP.

А вот мой класс SoapClient:

import com.sun.istack.internal.Nullable;
import org.apache.commons.io.IOUtils;
import org.xml.sax.InputSource;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.transform.sax.SAXSource;
import java.io.*;
import java.net.URL;

public class SoapClient {
// soapMessage is the request read from an xml file
    SOAPMessage callSoapWebServiceFromString(String soapEndpointUrl, String soapMessage, @Nullable File attachment) {
        try {
            // Create SOAP Connection
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();

            // Send SOAP Message to SOAP Server
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage message = messageFactory.createMessage();
            message.getSOAPPart().setContent(new SAXSource(new InputSource(new StringReader(soapMessage))));

            if (attachment != null) {
                DataHandler handler = new DataHandler(new FileDataSource(attachment));
                AttachmentPart attachPart = message.createAttachmentPart(handler);
                message.addAttachmentPart(attachPart);
                message.saveChanges();

                // String stringToWrite = IOUtils.toString(handler.getInputStream(), "utf-8");
                // System.out.println("stringToWrite: " + stringToWrite);
            }
            URL endpoint = new URL(soapEndpointUrl);
            SOAPMessage response = soapConnection.call(message, endpoint);
            // System.out.println("Response SOAP Message:");
            // response.writeTo(System.out);

            soapConnection.close();

            return response;
        } catch (Exception e) {
            System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
            e.printStackTrace();
        }
        return null;
    }


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

Ответы 1

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

Нашел ответ: attachPart.setContentId("<" + attachment.getName() + ">");

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