2012-04-23 32 views
6

Tôi đang cố tạo một thông báo SOAP đơn giản để gửi từ máy khách, nhưng tôi (dường như) không thể thay đổi URI của vùng tên "xà phòng" trong phong bì.Không thể thay đổi URI xà phòng trong phong bì bằng cách sử dụng java SoapMessage

Đây là những gì tiêu đề xà phòng NÊN trông giống như:

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> ... </soap:Envelope> 

Vì vậy, tôi đã đoạn mã sau:

final SOAPMessage sm = MessageFactory.newInstance().createMessage(); 

    final SOAPPart sp = sm.getSOAPPart(); 
    final SOAPEnvelope se = sp.getEnvelope(); 
    final SOAPHeader sh = se.getHeader(); 
    final SOAPBody sb = se.getBody(); 

    se.removeNamespaceDeclaration(se.getPrefix()); 
    se.addNamespaceDeclaration("soap", "http://www.w3.org/2001/12/soap-envelope"); 
    se.setPrefix("soap"); 
    sb.setPrefix("soap"); 
    sh.setPrefix("soap"); 
    se.setEncodingStyle("http://www.w3.org/2001/12/soap-encoding/"); 

Tuy nhiên, khi tôi in các thông điệp trước khi gửi, sau đây là phong bì của tôi :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> 

Lưu ý sự khác biệt trong URI của xmlns: xà phòng trong phần "cần phải" và thực tế.

Nếu tôi thay đổi đối số đầu tiên của addNamespaceDeclaration cuộc gọi đến "xà phòng" thay vì "xà phòng", đây là phong bì sau tôi nhận được:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapy="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> 

Tôi đoán nó có thể có cái gì để làm với thực tế là cuộc gọi là addNamespaceDeclaration thay vì một cái gì đó như changeNamespaceDeclaration, và nó bị bỏ qua xem xét không gian tên đã có mặt, nhưng tôi không thể tìm thấy cái gì đó hoạt động (tôi đã thử setAttributeNS).

EDIT: Tôi vừa nhận ra rằng setAttributeNS là ngớ ngẩn vì đó là thay đổi không gian tên, không phải là URI. CHỈNH SỬA LẠI: Tôi hơi bối rối, khi tôi tiếp tục tìm kiếm, đôi khi tôi đặt tên là soap:"Namespace", do đó tôi muốn thay đổi không gian tên ... nhưng tôi nghĩ không gian tên là phần "xà phòng" . Bất kỳ làm rõ?

Đây là bài đăng đầu tiên của tôi vì vậy tôi xin lỗi nếu tôi yêu cầu điều gì đó đã được giải quyết, nhưng tôi đã tìm kiếm và hầu hết những gì tôi tìm thấy có liên quan đến việc thay đổi không gian tên (như từ SOAP-ENV , đó là không gian tên mặc định, thành xà phòng) thay vì bản thân URI. Cảm ơn trước.

-M

Trả lời

13

Nói chung, bạn không cần phải sửa đổi không gian tên SOAP theo cách thủ công. Những gì bạn có thể muốn đạt được là tạo một thông báo SOAP 1.2 (có một không gian tên khác với SOAP 1.1). Cố gắng loại bỏ tất cả các dòng namespace làm thay đổi từ mã của bạn và thay đổi dòng đầu tiên để

final SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); 

Trong trường hợp bạn thực sự cần phải xác định các tiền tố đó nên được sử dụng, mã này dường như làm việc:

SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); 
sm.getSOAPPart().getEnvelope().setPrefix("soap"); 
sm.getSOAPPart().getEnvelope().removeNamespaceDeclaration("env"); 
sm.getSOAPHeader().setPrefix("soap"); 
sm.getSOAPBody().setPrefix("soap"); 
+1

Cám ơn Tuy nhiên, tôi đã thử khoảng 5 phút trước bài đăng của bạn và thấy rằng không gian tên mặc định đã thay đổi từ "SOAP-ENV" (mà tôi đã đổi thành "xà phòng") thành "env": ' \t ... ' Tôi thực sự cần phong bì để khớp với những gì tôi đã đăng ban đầu - bất kỳ đề xuất nào khác? Có lẽ tôi chỉ cần xây dựng thông điệp vì có vẻ như cả hai giao thức được hỗ trợ bởi MessageFactory không hoàn toàn đúng ... – MandM

+1

Tiền tố (ví dụ: 'env' hoặc' soap') không có ý nghĩa ngữ nghĩa, nó chỉ là một lối tắt để tham chiếu không gian tên (ví dụ: 'http: // www.w3.org/2003/05/soap-envelope'). – erikxiv

+0

Điều cần biết, tuy nhiên tôi tin rằng thiết bị mà tôi đang giao tiếp với yêu cầu các trường đó theo cách đó trong yêu cầu (tôi nghĩ). – MandM

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