Czy istnieje łatwy sposób (inaczej: nie używanie proxy), aby uzyskać dostęp do surowego XML żądania / odpowiedzi dla usługi internetowej opublikowanej z implementacją referencyjną JAX-WS (tę zawartą w JDK 1.5 i nowszych)? Muszę to zrobić za pomocą kodu. Samo zalogowanie go do pliku za pomocą sprytnych konfiguracji logowania byłoby fajne, ale wystarczające.
Wiem, że istnieją inne, bardziej złożone i kompletne frameworki, które mogą to zrobić, ale chciałbym, aby było to tak proste, jak to tylko możliwe, a axis, cxf itp. Dodają znaczny narzut, którego chcę uniknąć.
Dzięki!
java
web-services
jax-ws
Antonio
źródło
źródło
Odpowiedzi:
Poniższe opcje umożliwiają rejestrowanie całej komunikacji z konsolą (technicznie potrzebujesz tylko jednej z nich, ale zależy to od używanych bibliotek, więc ustawienie wszystkich czterech jest bezpieczniejszą opcją). Możesz ustawić go w kodzie, jak w przykładzie, lub jako parametr wiersza poleceń za pomocą -D lub jako zmienną środowiskową, jak napisała Upendra.
Szczegółowe informacje można znaleźć w pytaniu Śledzenie żądań / odpowiedzi XML za pomocą JAX-WS w przypadku wystąpienia błędu .
źródło
Oto rozwiązanie w surowym kodzie (zebrane dzięki stjohnroe i Shamik):
Gdzie SOAPLoggingHandler jest (zgrany z połączonych przykładów):
źródło
ep.publish(publishURL);
: co to jestpublishURL
(w moim kodzie adres URL wsdl jest zawarty w samej usłudze; nie mam żadnego adresu na zewnątrz. Czego brakuje?)Przed uruchomieniem tomcat ustaw
JAVA_OPTS
jak poniżej w środowisku Linux. Następnie uruchom Tomcat. Wcatalina.out
pliku zobaczysz żądanie i odpowiedź .źródło
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Ustaw następujące właściwości systemu, spowoduje to włączenie rejestrowania XML. Możesz to ustawić w javie lub pliku konfiguracyjnym.
dzienniki konsoli:
źródło
Wstrzyknij
SOAPHandler
do interfejsu punktu końcowego. możemy śledzić żądanie i odpowiedź SOAPImplementowanie SOAPHandler z Programmatic
Deklaratywne , dodając
@HandlerChain(file = "handlers.xml")
adnotację do interfejsu punktu końcowego.handlers.xml
SOAPLoggingHandler.java
źródło
Istnieją różne sposoby wykonywania tego programowo, jak opisano w innych odpowiedziach, ale są to dość inwazyjne mechanizmy. Jeśli jednak wiesz, że używasz JAX-WS RI (aka „Metro”), możesz to zrobić na poziomie konfiguracji. Zobacz tutaj, aby uzyskać instrukcje, jak to zrobić. Nie musisz martwić się swoją aplikacją.
źródło
// To rozwiązanie umożliwia programowe dodawanie modułu obsługi do klienta usługi sieciowej bez konfiguracji XML
// Zobacz pełną dokumentację tutaj: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Utwórz nową klasę, która implementuje SOAPHandler
// Programowo dodaj swój LogMessageHandler
źródło
Piszę nową odpowiedź, ponieważ nie mam wystarczającej reputacji, aby skomentować tę dostarczoną przez Antonio (patrz: https://stackoverflow.com/a/1957777 ).
W przypadku, gdy chcesz, aby wiadomość SOAP została wydrukowana w pliku (np. Przez Log4j), możesz użyć:
Należy pamiętać, że w pewnych okolicznościach wywołanie metody writeTo () może nie działać zgodnie z oczekiwaniami (patrz: https://community.oracle.com/thread/1123104?tstart=0 lub https://www.java.net/node / 691073 ), dlatego poniższy kod załatwi sprawę :
źródło
Musisz zaimplementować javax.xml.ws.handler.LogicalHandler, ten program obsługi musi następnie zostać przywołany w pliku konfiguracyjnym programu obsługi, do którego z kolei odwołuje się adnotacja @HandlerChain w punkcie końcowym usługi (interfejsie lub implementacji). Następnie możesz wysłać wiadomość przez system.out lub rejestrator w implementacji processMessage.
Widzieć
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html
http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html
źródło
Odpowiedzi wymienione tutaj, które prowadzą do użycia,
SOAPHandler
są w pełni poprawne. Zaletą tego podejścia jest to, że będzie działać z każdą implementacją JAX-WS, ponieważ SOAPHandler jest częścią specyfikacji JAX-WS. Jednak problem z SOAPHandler polega na tym, że niejawnie próbuje przedstawić całą wiadomość XML w pamięci. Może to prowadzić do ogromnego zużycia pamięci. Różne implementacje JAX-WS dodały własne obejścia tego problemu. Jeśli pracujesz z dużymi żądaniami lub dużymi odpowiedziami, musisz przyjrzeć się jednemu z zastrzeżonych podejść.Ponieważ pytasz o „ten zawarty w JDK 1.5 lub lepszy”, odpowiem w odniesieniu do tego, co jest formalnie znane jako JAX-WS RI (aka Metro), które jest zawarte w JDK.
JAX-WS RI ma na to specyficzne rozwiązanie, które jest bardzo wydajne pod względem wykorzystania pamięci.
Zobacz https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Niestety ten link jest teraz uszkodzony, ale możesz go znaleźć w WayBack Machine. Poniżej podam najważniejsze informacje:
Ludzie z Metro w 2007 roku wprowadzili dodatkowy typ obsługi
MessageHandler<MessageHandlerContext>
, który jest własnością Metro. Jest o wiele bardziej wydajne niżSOAPHandler<SOAPMessageContext>
to, że nie próbuje wykonywać reprezentacji DOM w pamięci.Oto kluczowy tekst z oryginalnego artykułu na blogu:
(końcowy cytat z wpisu na blogu z 2007 roku)
Nie trzeba dodawać, że niestandardowy Handler,
LoggingHandler
w tym przykładzie, musi zostać dodany do łańcucha Handler Chain, aby miał jakikolwiek efekt. To jest to samo, co dodawanie innychHandler
, więc możesz zajrzeć do innych odpowiedzi na tej stronie, aby dowiedzieć się, jak to zrobić.Możesz znaleźć pełny przykład w repozytorium Metro GitHub .
źródło
Możesz spróbować umieścić
ServletFilter
przed usługą sieciową i sprawdzić żądanie i odpowiedź przychodzące / zwracane z usługi.Chociaż specjalnie nie prosiłeś o proxy, czasami uważam, że tcptrace wystarczy, aby zobaczyć, co się dzieje w połączeniu. To proste narzędzie, bez instalacji, pokazuje strumienie danych i może również zapisywać do pliku.
źródło
W czasie wykonywania możesz po prostu wykonać
ponieważ zrzut jest publiczną zmienną zdefiniowaną w klasie w następujący sposób
źródło
czy mam rację rozumiejąc, że chcesz zmienić / uzyskać dostęp do nieprzetworzonej wiadomości XML?
Jeśli tak, Ty (lub następny facet, ponieważ ma pięć lat) możesz rzucić okiem na interfejs dostawcy, który jest częścią JAXWS. Odpowiednik klienta jest wykonywany przy użyciu klasy „Wysyłka”. W każdym razie nie musisz dodawać obsługi ani przechwytywaczy. Oczywiście nadal MOŻESZ. Wadą jest to, że jesteś CAŁKOWICIE odpowiedzialny za zbudowanie SOAPMessage, ale jest to łatwe, a jeśli tego chcesz (tak jak ja), jest to idealne.
Oto przykład po stronie serwera (trochę niezdarny, służył tylko do eksperymentowania) -
Publikujesz to tak, jakbyś był SEI,
Możesz też użyć do tego klasy Endpoint. Mam nadzieję, że to było pomocne.
I och, jeśli chcesz, nie musisz zajmować się nagłówkami i innymi rzeczami, jeśli zmienisz tryb usługi na PAYLOAD (dostaniesz tylko Soap Body).
źródło
za pomocą plików konfiguracyjnych logback.xml możesz:
Spowoduje to zarejestrowanie żądania i takiej odpowiedzi (w zależności od konfiguracji danych wyjściowych dziennika):
źródło
Przez kilka dni próbowałem znaleźć bibliotekę ramową do rejestrowania żądania mydła usługi sieciowej i odpowiedzi. Poniższy kod rozwiązał problem:
źródło
Jednym ze sposobów jest nieużywanie kodu, ale używanie snifferów pakietów sieciowych, takich jak Etheral lub WireShark, które mogą przechwytywać pakiet HTTP z komunikatem XML jako ładunkiem do niego i możesz nadal rejestrować je w pliku lub tak dalej.
Ale bardziej wyrafinowanym podejściem jest napisanie własnych programów obsługi wiadomości. Możesz go zobaczyć tutaj .
źródło
Tak właściwie. Jeśli spojrzysz na źródła HttpClientTransport, zauważysz, że zapisuje on również wiadomości w java.util.logging.Logger. Co oznacza, że możesz zobaczyć te wiadomości również w swoich dziennikach.
Na przykład, jeśli używasz Log4J2, wszystko, co musisz zrobić, to:
Po wykonaniu tych czynności w dziennikach zaczniesz widzieć komunikaty SOAP.
źródło
W tym wątku jest kilka odpowiedzi za pomocą SoapHandlers. Powinieneś wiedzieć, że SoapHandlers modyfikują wiadomość, jeśli
writeTo(out)
zostanie wywołana.Wywołanie
writeTo(out)
metody SOAPMessage automatycznie wywołujesaveChanges()
również metodę. W rezultacie wszystkie dołączone dane binarne MTOM / XOP w wiadomości zostaną utracone.Nie jestem pewien, dlaczego tak się dzieje, ale wydaje się, że jest to udokumentowana funkcja.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
źródło
Jeśli zdarzy ci się uruchomić serwer aplikacji IBM Liberty, po prostu dodaj ibm-ws-bnd.xml do katalogu WEB-INF.
źródło