2010-10-27 34 views
15

Tôi đang gọi một dịch vụ web SOAP với Spring-WS. Webservice trong câu hỏi đòi hỏi tôi phải vượt qua một số thông tin trong tiêu đề SOAP như ở đây:Thêm các phần tử con vào tiêu đề SOAP tùy chỉnh trong Spring-WS

<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> 

Tôi đã tìm ra cách để có CustomHeaderElement cấp cao nhất, nhưng tôi không thấy bất cứ điều gì vào mùa xuân-WS API cho phép tôi thêm phần tử con. Dưới đây là những gì tôi có cho đến thời điểm này:

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

Vấn đề là headerElement dường như không để lộ bất kỳ phương tiện nào thực sự thêm trẻ em. Tôi biết tôi có thể thêm một thuộc tính, nhưng đó không phải là những gì tôi cần cho cuộc gọi dịch vụ này. Có ai biết làm thế nào tôi có thể thêm các yếu tố con cần thiết vào tiêu đề tùy chỉnh của tôi?

Trả lời

1

Tôi không hài lòng với giải pháp này, nhưng khi nó quay ra bạn thực sự có thể truyền thông điệp đến một SOAPMessage cho phép bạn truy cập đầy đủ vào tất cả các apis SAAJ. Từ đó bạn có thể xây dựng bất kỳ yếu tố nào bạn muốn bên trong tiêu đề.

+1

Bạn có ý nghĩa gì đó tương tự như bài đăng này không: http://stackoverflow.com/questions/4046075/how-to-add-soap-headers-to-spring-jax-ws-client nơi Biến áp được sử dụng sau khi truyền tin nhắn đến SOAPMessage? Tôi đồng ý rằng nó không thực sự dễ chịu hay thanh lịch. Tôi tự hỏi tại sao. – chris

+1

-1 Không thực sự là câu trả lời. P.S. liên kết được cung cấp bởi @chris có các giải pháp tốt. – kaskelotti

+1

Câu trả lời của bạn, thậm chí được đánh dấu là câu trả lời đúng, không giúp ích gì cho chúng tôi. – marionmaiden

8

tôi đi qua cùng một vấn đề, đây là giải pháp của tôi, nhưng nó sẽ chỉ làm việc yếu tố đơn giản không cho phức tạp:

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

nó tạo ra sau XML:

<SOAP-ENV:Header> 
    <wsa:MessageID>urn:abcdef1234</wsa:MessageID> 
</SOAP-ENV:Header> 

BTW javax.xml.soap.SOAPMessage có thể làm việc quá, xem tại đây: http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html#bnbia

3
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()); 

Nó được sản xuất đầu ra

<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> 
+3

Chào mừng bạn đến với SO! Vui lòng bao gồm giải thích về mã của bạn và cách nó trả lời câu hỏi. Nếu bạn nhận được một đoạn mã như một câu trả lời, bạn có thể không biết phải làm gì với nó. Câu trả lời nên cung cấp hướng dẫn OP về cách gỡ lỗi và khắc phục sự cố của họ. Chỉ ra, ý tưởng đằng sau mã của bạn là gì, giúp hiểu rõ vấn đề và áp dụng hoặc sửa đổi giải pháp của bạn. – Palec

0

tôi đã cùng một vấn đề và giải quyết nó với đoạn mã sau:

Result result = ((SoapMessage) message).getSoapHeader().getResult(); 
webServiceTemplate.getMarshaller().marshal(createCustomHeader(), result); 

Phương pháp createCustomerHeader() tạo một bean JAXB được tạo ra từ các XSD.

Các vấn đề liên quan