6

クライアントから送信する単純な SOAP メッセージを作成しようとしていますが、(一見) エンベロープ内の「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/">

「すべき」セクションと実際の xmlns:soap の URI の違いに注意してください。

呼び出しの最初の引数をaddNamespaceDeclaration「soap」ではなく「soapy」に変更すると、次のエンベロープが得られます。

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

addNamespaceDeclaration呼び出しが のようなものではなく、名前空間が既に存在することを考慮して無視されるという事実と関係があるのではないかと推測していchangeNamespaceDeclarationますが、機能するものを見つけることができません(既に試しましたsetAttributeNS)。

setAttributeNS編集: URIではなく名前空間を変更しているため、それはばかげていることに気付きました。もう一度編集:検索を続けるsoap:"Namespace"と、名前が . 説明はありますか?

これは私の最初の投稿なので、既に解決されていることを尋ねている場合はお詫びしますが、検索したところ、見つかったもののほとんどは名前空間の変更に関連しています (SOAP-ENV からのように、これはURI 自体ではなく、soap へのデフォルトの名前空間。前もって感謝します。

-M

4

1 に答える 1

16

通常、SOAP 名前空間を手動で変更する必要はありません。おそらく達成したいことは、SOAP 1.2 メッセージ (SOAP 1.1 とは異なる名前空間を持つ) を作成することです。名前空間を変更するすべての行をコードから削除して、最初の行を次のように変更してみてください。

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

使用するプレフィックスを本当に指定する必要がある場合は、次のコードが機能するようです。

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");
于 2012-04-23T19:11:57.297 に答える