2012-04-23 29 views
6

Próbuję utworzyć prostą wiadomość SOAP, aby wysłać ją od klienta, ale jestem (na pozór) nie mogę zmienić identyfikatora URI "mydlanej" przestrzeni nazw w kopercie.Nie można zmienić identyfikatora URI mydła w kopercie za pomocą java SoapMessage

To właśnie nagłówek mydło powinna wyglądać następująco:

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

Więc mam następujący kod:

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

Kiedy jednak wydrukować wiadomość przed wysłaniem, oto moja koperta :

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

Zauważ różnice w identyfikatorach URI xmlns: soap w sekcji "powinno być" i rzeczywiste.

Gdybym zmienić pierwszy argument addNamespaceDeclaration wezwanie do „mydlany”, a nie „mydło”, to jest po koperta uzyskać:

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

Zgaduję, może to mieć coś wspólnego z fakt, że wywołanie to addNamespaceDeclaration, a nie jak coś w rodzaju changeNamespaceDeclaration, i jest ignorowane, biorąc pod uwagę, że przestrzeń nazw już istnieje, ale nie mogę znaleźć czegoś, co działa (próbowałem już setAttributeNS).

EDYCJA: Właśnie zdałem sobie sprawę, że setAttributeNS jest głupie, ponieważ zmienia to przestrzeń nazw, a nie URI. EDYCJA PONOWNIE: Jestem trochę zdezorientowany, ponieważ wciąż szukam, czasami widzę, że nazwa sięga soap:"Namespace", więc w tym sensie chcę zmienić przestrzeń nazw ... ale myślałem, że przestrzeń nazw była częścią "mydła" . Jakiekolwiek wyjaśnienia?

To jest mój pierwszy wpis, więc przepraszam, jeśli pytam o coś, co już zostało rozwiązane, ale przeszukałem i większość z tego, co znalazłem, jest związana ze zmianą przestrzeni nazw (jak z SOAP-ENV , która jest domyślną przestrzenią nazw, do mydła), a nie sam URI. Z góry dziękuję.

-M

Odpowiedz

13

Na ogół nie ma potrzeby ręcznego modyfikowania nazw SOAP. Prawdopodobnie chcesz utworzyć komunikat SOAP 1.2 (który ma inną przestrzeń nazw niż SOAP 1.1). Spróbuj usunąć wszystkie linie nazw zmieniania z kodu i zmienić pierwszą linię do

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

W przypadku naprawdę musisz określić prefiks, które powinny być stosowane, kod ten wydaje się działać:

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

Dzięki za szybka odpowiedź erik, jednak próbowałem to około 5 minut przed twoją pocztą i zobaczyłem, że domyślna przestrzeń nazw zmieniła się z "SOAP-ENV" (który zamieniłem na "mydło") na "env": ' \t ... ' Naprawdę potrzebuję koperty, aby dopasować to, co pierwotnie napisałem - jakieś inne sugestie? Może po prostu muszę zbudować wiadomość, ponieważ wydaje się, że oba protokoły obsługiwane przez MessageFactory nie są całkiem słuszne ... – MandM

+1

Prefiks (np. 'Env' lub' soap') nie ma znaczenia semantycznego, jest tylko skrótem do odniesienia przestrzeń nazw (np. 'http: // www.w3.org/2003/05/soap-envelope'). – erikxiv

+0

Dobrze wiedzieć, ale uważam, że urządzenie, z którym się komunikuję, wymaga, aby te pola były w ten sposób w żądaniu (chyba). – MandM

Powiązane problemy