Как исправить файл, не присоединяющийся к сообщению SAAJ SOAP в Java? - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать клиент для веб-службы 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;
    }


}

1 Ответ

0 голосов
/ 14 июня 2019

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

...