简体   繁体   English

两个不同的 POJO 编组到一个 XML

[英]Two different POJO marshal to one XML

I need send SOAP request like this我需要像这样发送 SOAP 请求

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:ser="foo.com/Public/Services" 
xmlns:typ="foo.com/Public/Types">
   <soap:Header/>
   <soap:Body>
      <ser:InputParms>
         <!--some parameters:-->
      </ser:InputParms>
      <ser:Metadata>
         <!--some parameters:-->
      </ser:Metadata>
   </soap:Body>
</soap:Envelope>

How can see XML contains two objects: InputParms and Metadata.怎么看XML包含两个对象:InputParms和Metadata。

jaxb plugin generates two corresponding POJO from WSDL. jaxb 插件从 WSDL 生成两个对应的 POJO。 I try to send SOAP request using spring ws.我尝试使用 spring ws 发送 SOAP 请求。 It is possible to use following method可以使用以下方法

public Object marshalSendAndReceive(String uri,
                                        final Object requestPayload,
                                        final WebServiceMessageCallback requestCallback)

The method accepts only one object as payload.该方法只接受一个对象作为有效负载。 But I need send two objects.但我需要发送两个对象。 I cannot understand how do it?我不明白怎么做? Or how can I marshal these two POJO to on XML?或者我如何将这两个 POJO 编组到 XML 上?

I've found a solution.我找到了解决办法。 I compose two different SOAP message and merge two envelopes to single.我编写了两个不同的 SOAP 消息并将两个信封合并为一个。

public class ClientImpl extends WebServiceGatewaySupport {

private static final String ACTION = "foo.com/services";

@Value("${uri}")
private String uri;

public Response sendRequest(ManualRequest request) {
    WebServiceTemplate template = getWebServiceTemplate();

    Response response = (Response) template.marshalSendAndReceive(
            uri,
            request.getSecondPayloadObject(),
            new SoapPayloadMergeCallback(request.getFirstPayloadObject(),
                    ACTION,
                    getMarshaller())
    );

    return response;
}

private static final class SoapPayloadMergeCallback implements WebServiceMessageCallback {

    public SoapPayloadMergeCallback(Object additionalPayloadObject, String soapAction, Marshaller marshaller) {
        this.additionalPayloadObject = additionalPayloadObject;
        this.soapAction = soapAction;
        this.marshaller = marshaller;
    }

    private final Object additionalPayloadObject;
    private final String soapAction;
    private final Marshaller marshaller;

    @Override
    public void doWithMessage(WebServiceMessage message) throws IOException {
        SoapMessage soapMessage = (SoapMessage) message;
        soapMessage.setSoapAction(soapAction);

        Node additional = soapMessage.getDocument().cloneNode(true);

        MarshallingUtils.marshal(marshaller, additionalPayloadObject, message);
        soapMessage = (SoapMessage) message;
        Document target = soapMessage.getDocument();

        merge(target, (Document) additional);
    }

    private void merge(Document target, Document additional) {
        Element envelopeElementAdditional = additional.getDocumentElement();
        Node bodyNodeAdditional = envelopeElementAdditional.getChildNodes().item(1);
        Node elementToMove = bodyNodeAdditional.getFirstChild();

        Node importedNode = target.adoptNode(elementToMove);

        Element envelopeElementTarget = target.getDocumentElement();
        Node bodyNodeTarget = envelopeElementTarget.getChildNodes().item(1);
        bodyNodeTarget.appendChild(importedNode);
    }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM