2013-07-10 6 views
6

これらの2つのSOAPメッセージは有効ですか?異なる部分は、名前空間属性xmlns = "http://www.sigvalue.com/acc"です。最初の石鹸はサンプルで、2番目の石鹸は同じソープメッセージを作るためにJavaコードによって生成されます。有効なSOAP SAAJエンベロープでデフォルトネームスペースを使用

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
    <GetNGPList xmlns="http://www.sigvalue.com/acc"> 
    <UserData> 
    <senderId>string</senderId> 
    <channelId>string</channelId> 
    <timeStamp>dateTime</timeStamp> 
    </UserData> 
    <zipCode>string</zipCode> 
</GetNGPList> 
</soap:Body> 
</soap:Envelope> 

。第二石鹸が無効である場合

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<GetNGPList> 
    <UserData xmlns="http://www.sigvalue.com/acc"> 
    <senderId>string</senderId> 
    <channelId>string</channelId> 
    <timeStamp>dateTime</timeStamp> 
    </UserData xmlns="http://www.sigvalue.com/acc"> 
    <zipCode>string</zipCode> 
</GetNGPList> 
</soap:Body> 
</soap:Envelope> 

、どのように私はそれが最初のものと同じにするだろうか? GetNGPList.addNamespaceDeclaration( "xmlns"、 "http://www.sigvalue.com/acc");この行は期待どおりに動作しません。ここではJavaコードは次のとおりです。

MessageFactory messageFactory = MessageFactory.newInstance(); 
    SOAPMessage soapMessage = messageFactory.createMessage(); 

    SOAPPart soapPart = soapMessage.getSOAPPart(); 


    // SOAP Envelope 
    SOAPEnvelope envelope = soapPart.getEnvelope(); 
    envelope.addNamespaceDeclaration("xsi", gXSIServerURI); 
    envelope.addNamespaceDeclaration("xsd", gXSDServerURI); 

     // SOAP Body 
    SOAPBody soapBody = envelope.getBody(); 
    SOAPElement GetNGPList = soapBody.addChildElement("GetNGPList"); 
    GetNGPList.addNamespaceDeclaration("xmlns","http://www.sigvalue.com/acc"); 

    SOAPElement UserData = GetNGPList.addChildElement("UserData"); 
    SOAPElement senderId = UserData.addChildElement("senderId"); 
    SOAPElement channelId = UserData.addChildElement("channelId"); 
    SOAPElement timeStamp = UserData.addChildElement("timeStamp"); 
    senderId.addTextNode("string"); 
    channelId.addTextNode("string"); 
    timeStamp.addTextNode("dateTime"); 

    SOAPElement zipCode = GetNGPList.addChildElement("zipCode"); 
    zipCode.addTextNode("string"); 


    MimeHeaders headers = soapMessage.getMimeHeaders(); 
    headers.addHeader("SOAPAction", "sample"); 

    soapMessage.saveChanges(); 

    /* Print the request message */ 
    //System.out.print("Request SOAP Message = "); 
    soapMessage.writeTo(System.out); 

答えて

8

次のようになります。上記のコード

SOAPElement GetNGPList = 
     soapBody.addChildElement("GetNGPList", "", "http://www.sigvalue.com/acc"); 
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

適用されますxmlns="http://www.sigvalue.com/acc"GetNGPList。適応

あなたのコードは、:あなたがaddChildElement()に名前空間接頭辞の宣言を省略する場合

いつものように
// SOAP Body 
SOAPBody soapBody = envelope.getBody(); 
SOAPElement GetNGPList = 
     soapBody.addChildElement("GetNGPList", "", "http://www.sigvalue.com/acc"); 

SOAPElement UserData = GetNGPList.addChildElement("UserData"); 
... 

、子は親からその名前空間を継承します。 、これは動作します

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Header /> 
    <SOAP-ENV:Body> 
     <GetNGPList xmlns="http://www.sigvalue.com/acc"> 
      <UserData> 
       <senderId>string</senderId> 
... 
+0

ありがとう:

上記のコードは、あなたが必要なものが生成されます! – Frank

+0

あなたは私の一日を作った! – ForguesR

0

あなたはこの行を削除することができます

GetNGPList.addNamespaceDeclaration("xmlns","http://www.sigvalue.com/acc"); 

をして

envelope.addNamespaceDeclaration("","http://www.sigvalue.com/acc"); 

いくつかの注意事項を次の行を追加します。

  • 私はフレームワークを使ってWebサービスを扱うApache CXFは、あなたにとって面倒な作業をたくさん行うことができます。http://cxf.apache.org/

  • 通常の命名基準に従うことを忘れないでください。コードを読みやすくなります。変数GetNGPListは単にプレフィックス名として空の文字列("")を使用し、デフォルトの名前空間として名前空間を設定するにはgetNGPList

関連する問題