أضف عناصر الطفل إلى رأس الصابون المخصص في الربيع WS
سؤال
أنا أدعو خدمة ويب الصابون مع Spring-WS. تتطلب مني خدمة الويب المعنية اجتياز بعض المعلومات في رأس SOAP كما هو موضح هنا:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<CustomHeaderElement>
<clientID>xyz</clientID>
<wsdlVersion>1.0</wsdlVersion>
<serviceType>ExampleService_v1</serviceType>
</CustomHeaderElement>
</soapenv:Header>
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>
لقد اكتشفت كيف حصلت على أعلى مستوى من المستوى المخصص ، لكنني لا أرى أي شيء في API Spring-WS يتيح لي إضافة عنصر طفل. هذا ما لدي حتى الآن:
WebServiceTemplate template = ...;
template.marshalSendAndReceive(request, new WebServiceMessageCallback(){
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{
SoapMessage soapMessage = (SoapMessage)message;
SoapHeader soapHeader = soapMessage.getSoapHeader();
QName qName = new QName("CustomHeaderElement");
SOAPHeaderElement headerElement = soapHeader.addHeaderElement(qName);
//would like to do something like headerElement.addChild(clientIdNode);
}
});
المشكلة هي أن الرأس لا يبدو أنه يعرض أي وسيلة لإضافة طفل فعليًا. أعلم أنه يمكنني إضافة سمة ، لكن هذا ليس ما أحتاجه لمكالمة الخدمة هذه. هل يعرف أي شخص كيف يمكنني إضافة عناصر الطفل اللازمة إلى رأس مخصص؟
المحلول 3
لست سعيدًا بهذا الحل ، ولكن كما اتضح ، يمكنك بالفعل إلقاء الرسالة على صابون يمنحك الوصول الكامل إلى جميع واجهات برمجة التطبيقات SAAJ. من هناك يمكنك بناء أي عناصر تريدها داخل الرأس.
نصائح أخرى
لقد صادفت نفس المشكلة ، وإليك الحل الخاص بي ولكنه سيعمل فقط عناصر بسيطة وليس معقدة:
template.marshalSendAndReceive(request, new WebServiceMessageCallback(){
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{
SaajSoapMessage soapMessage = (SaajSoapMessage) message;
SoapHeaderElement messageId = soapMessage.getSoapHeader().addHeaderElement(new QName("http://www.w3.org/2005/08/addressing", "MessageID", "wsa"));
messageId.setText("urn:abcdef1234");
}
});
ينتج بعد XML:
<SOAP-ENV:Header>
<wsa:MessageID>urn:abcdef1234</wsa:MessageID>
</SOAP-ENV:Header>
بالمناسبة javax.xml.soap.SOAPMessage
يمكن أن تعمل أيضًا ، انظر هنا: http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html#bnbia
final String datPrefix = "dat";
final String datNamespaceUri = "UPRS/Services/IProviderDataManagement/Datatypes";
final String mesPrefix = "mes";
final String mesNamespaceUri = "UPRS/Services/IProviderDataManagement/Messages";
SoapEnvelope se = s.getEnvelope();
se.addNamespaceDeclaration(mesPrefix,
mesNamespaceUri);
se.addNamespaceDeclaration(datPrefix,
datNamespaceUri);
SoapMessage s = (SoapMessage) message;
Element root = new Element("requestContext", mesPrefix, mesNamespaceUri);
Element child = new Element("commandId", datPrefix, datNamespaceUri).addContent(guid);
root.addContent(child);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new JDOMSource(root), s.getSoapHeader().getResult());
أنتج الإخراج
<SOAP-ENV:Header>
<mes:requestContext xmlns:mes="UPRS/Services/IProviderDataManagement/Messages">
<dat:commandId xmlns:dat="UPRS/Services/IProviderDataManagement/Datatypes">ba7b1e13-8a06-49b6-a264-fc0298f55f4f</dat:commandId>
</mes:requestContext>
</SOAP-ENV:Header>
واجهت نفس المشكلة وحلها مع المقتطف التالي:
Result result = ((SoapMessage) message).getSoapHeader().getResult();
webServiceTemplate.getMarshaller().marshal(createCustomHeader(), result);
ال createCustomerHeader()
الطريقة تنشئ حبة jaxb التي تم إنشاؤها من XSD.