it-roy-ru.com

Получение сырого XML из SOAPMessage в Java

Я настроил SOAP WebServiceProvider в JAX-WS, но у меня возникают проблемы с выяснением, как получить необработанный XML из объекта SOAPMessage (или любого узла). Вот пример кода, который я получил прямо сейчас, и где я пытаюсь получить XML:

@WebServiceProvider(wsdlLocation="SoapService.wsdl")
@ServiceMode(value=Service.Mode.MESSAGE)
public class SoapProvider implements Provider<SOAPMessage>
{
    public SOAPMessage invoke(SOAPMessage msg)
    {
        // How do I get the raw XML here?
    }
}

Есть ли простой способ получить XML исходного запроса? Если есть способ получить необработанный XML, настроив другого типа провайдера (например, Source), я бы тоже хотел это сделать.

67
Daniel Lew

Оказывается, можно получить необработанный XML с помощью Provider <Source> следующим образом:

import Java.io.ByteArrayOutputStream;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;

@ServiceMode(value=Service.Mode.PAYLOAD)
@WebServiceProvider()
public class SoapProvider implements Provider<Source>
{
    public Source invoke(Source msg)
    {
        StreamResult sr = new StreamResult();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        sr.setOutputStream(out);

        try {
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(msg, sr);

            // Use out to your heart's desire.
        }
        catch (TransformerException e) {
            e.printStackTrace();
        }    

        return msg;
    }
}

В итоге я не нуждался в этом решении, поэтому я сам на самом деле не пробовал этот код - может потребоваться некоторая настройка, чтобы получить право. Но я знаю, что это правильный путь для получения необработанного XML из веб-службы.

(Я не уверен, как заставить это работать, если вам абсолютно необходим объект SOAPMessage, но, опять же, если вы все равно собираетесь обрабатывать необработанный XML, зачем вам использовать объект более высокого уровня?)

11
Daniel Lew

Вы можете попробовать таким образом.

SOAPMessage msg = messageContext.getMessage();
ByteArrayOutputStream out = new ByteArrayOutputStream();
msg.writeTo(out);
String strMsg = new String(out.toByteArray());
141
Smith Torsahakul

Если у вас есть SOAPMessage или SOAPMessageContext, вы можете использовать Transformer, преобразовав его в Source через DOMSource:

            final SOAPMessage message = messageContext.getMessage();
            final StringWriter sw = new StringWriter();

            try {
                TransformerFactory.newInstance().newTransformer().transform(
                    new DOMSource(message.getSOAPPart()),
                    new StreamResult(sw));
            } catch (TransformerException e) {
                throw new RuntimeException(e);
            }

            // Now you have the XML as a String:
            System.out.println(sw.toString());

Это будет учитывать кодировку, поэтому ваши «специальные символы» не будут искажены.

18
artbristol

просто для отладки используйте однострочный код -

msg.writeTo(System.out);

11
Shahadat Hossain Khan

Если вам нужно отформатировать строку xml в xml, попробуйте это:

String xmlStr = "your-xml-string";
Source xmlInput = new StreamSource(new StringReader(xmlStr));
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput,
        new StreamResult(new FileOutputStream("response.xml")));
6
Hari

Использование Transformer Factory: -

public static String printSoapMessage(final SOAPMessage soapMessage) throws TransformerFactoryConfigurationError,
            TransformerConfigurationException, SOAPException, TransformerException
    {
        final TransformerFactory transformerFactory = TransformerFactory.newInstance();
        final Transformer transformer = transformerFactory.newTransformer();

        // Format it
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "2");

        final Source soapContent = soapMessage.getSOAPPart().getContent();

        final ByteArrayOutputStream streamOut = new ByteArrayOutputStream();
        final StreamResult result = new StreamResult(streamOut);
        transformer.transform(soapContent, result);

        return streamOut.toString();
    }
4
Sireesh Yarlagadda

это работает

 final StringWriter sw = new StringWriter();

try {
    TransformerFactory.newInstance().newTransformer().transform(
        new DOMSource(soapResponse.getSOAPPart()),
        new StreamResult(sw));
} catch (TransformerException e) {
    throw new RuntimeException(e);
}
System.out.println(sw.toString());
return sw.toString();
2
user2900572

если у вас есть клиентский код, вам просто нужно добавить следующие две строки, чтобы получить XML-запрос/ответ. Здесь _call это org.Apache.axis.client.Call

String request = _call.getMessageContext().getRequestMessage().getSOAPPartAsString();
String response = _call.getMessageContext().getResponseMessage().getSOAPPartAsString();
0
ARIJIT