Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个不同的POJO封送到一个XML_Xml_Soap_Jaxb_Spring Ws - Fatal编程技术网

两个不同的POJO封送到一个XML

两个不同的POJO封送到一个XML,xml,soap,jaxb,spring-ws,Xml,Soap,Jaxb,Spring Ws,我需要像这样发送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> <!-

我需要像这样发送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>
该方法只接受一个对象作为有效负载。 但我需要发送两个对象。我不明白怎么做? 或者如何将这两个POJO封送到XML上?

我找到了一个解决方案。 我编写了两个不同的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);
    }
}
}

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);
    }
}