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



我需要像这样发送 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>

如何看XML包含两个对象:InputParms 和 Metadata。

jaxb 插件从 WSDL 生成两个相应的 POJO。 我尝试使用弹簧ws发送SOAP请求。 可以使用以下方法

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

该方法仅接受一个对象作为有效负载。 但是我需要发送两个对象。我不明白是怎么做到的? 或者我怎样才能在 XML 上封送这两个 POJO?

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

}

最新更新