2013-07-10 23 views
6

Czy te dwa komunikaty o myciu są prawidłowe? Inną częścią jest atrybut namespace xmlns = "http://www.sigvalue.com/acc". Pierwsze mydło jest próbką, drugie wygenerowane przez kod java, aby utworzyć ten sam komunikat mydlany.Użyj domyślnej przestrzeni nazw w poprawnej kopercie 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> 

Jeśli drugi mydło jest nieważne, w jaki sposób mogę zrobić to samo jako pierwszy? GetNGPList.addNamespaceDeclaration ("xmlns", "http://www.sigvalue.com/acc"); ta linia nie działa zgodnie z oczekiwaniami. Oto kod 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); 

Odpowiedz

8

Aby ustawić nazw jako domyślnej przestrzeni nazw, wystarczy użyć pusty ciąg ("") jako przedrostek nazwy:

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

Powyższy kod będzie stosowany xmlns="http://www.sigvalue.com/acc" do GetNGPList.

Twój kod, przystosowany:

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

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

Jak zwykle, gdy pominięcie deklaracji namespace prefix w addChildElement(), dziecko dziedziczy nazw od jego rodzica.

Powyższy kod wygeneruje co potrzebne:

<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

To działa, dziękuję! – Frank

+0

Zrobiłeś mój dzień! – ForguesR

0

można usunąć tę linię:

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

i dodać ten wiersz

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

kilka uwag:

  • I sugerować używanie ram dla Pracując z usługami sieciowymi, Apache CXF może wykonać wiele trudnych zadań: http://cxf.apache.org/

  • przestrzegaj normalnych standardów nazewnictwa, ułatwia to odczytanie kodu. Zmienna GetNGPList powinny być getNGPList