2012-04-23 7 views
6

クライアントから送信する単純なSOAPメッセージを作成しようとしていますが、封筒の「soap」名前空間のURIを変更できません。Java SoapMessageを使用してエンベロープ内のSOAP URIを変更できない

これは、SOAPヘッダーがどのように見えるかされています

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

だから私は次のコードを持っている:私は、送信する前にメッセージを印刷するとき

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

をただし、以下は私の封筒です:

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

"should-be"セクションのxmlns:soapのURIの違いに注目してくださいと実際の。

私が代わりに「石鹸」の「石鹸」へaddNamespaceDeclarationコールの最初の引数を変更した場合、これは私が手に、次の封筒です:

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

私はそれはとは何かを持っていることが推測しています実際にはchangeNamespaceDeclarationのようなものではなくaddNamespaceDeclarationであり、名前空間がすでに存在していると考えられても無視されますが、何かを見つけることができません(私は既にsetAttributeNSを試しています)。

EDIT:setAttributeNSがURIではなく名前空間を変更しているので、愚かなことに気付きました。 もう一度編集してください:私はちょっと混乱しています。検索を続けると、名前がsoap:"Namespace"になってしまうので、その意味で私は名前空間を変更したいのですが...名前空間が "石鹸"部分だと思った。任意の明確化?

これは私の最初の投稿ですので、私はすでに解決されていることを尋ねていますが謝りますが、私は検索しましたが、私が見つけたものの大部分はSOAP-ENVこれはURI自体ではなく、デフォルトの名前空間であり、soapになります)。前もって感謝します。

-M

答えて

13

通常、SOAP名前空間を手動で変更する必要はありません。おそらく達成したいのは、SOAP 1.2メッセージ(SOAP 1.1とは異なる名前空間を持つ)を作成することです。用

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

感謝を:あなたのコードから行を変更し、すべての名前空間を削除してみて、あなたが本当に使用すべきことであるが、その接頭辞を指定する必要がある場合には

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

に最初の行を変更し、このコードが動作しているようですしかし、私はあなたの投稿の約5分前にそれを試してみたところ、デフォルトの名前空間が "SOAP-ENV"( "soap"に変更)から "env"に変更されたことがわかりました: ' \t ... ' 私が最初に投稿したものと一致するように封筒が本当に必要です - それ以外の提案はありますか? MessageFactoryでサポートされているプロトコルの両方が正しくないと思われるので、メッセージを構築する必要があるかもしれません。 – MandM

+1

接頭辞(例: 'env'または' soap')は意味上の意味を持ちません。名前空間(http:// www.w3.org/2003/05/soap-envelope'など)。 – erikxiv

+0

よく知っておきたいと思いますが、私が通信しているデバイスでは、これらのフィールドが要求の中でそのようになっている必要があります(私は思っています)。 – MandM

関連する問題