2012-08-17 11 views
5

(Kontynuacja tego pytania: Getting raw XML response from Java web service client)Jak mogę przekazać dane z procedury obsługi SOAP do klienta usługi WWW?

Posiadam obsługę wiadomości SOAP, która jest w stanie uzyskać nieprzetworzony kod XML odpowiedzi serwisu WWW. Muszę pobrać ten XML do klienta usługi sieciowej, aby móc wykonać niektóre transformacje XSL na odpowiedź, zanim wyślę ją na swój sposób. Mam problem z wymyśleniem dobry sposób na uzyskanie danych z obsługi SOAP, który przechwytuje wiadomości przychodzących, i udostępnia surowego XML dla wygenerowanego (z WSDL) klienta usługi sieci Web. Wszelkie pomysły, jeśli jest to możliwe?


mam wymyślić coś takiego:

public class CustomSOAPHandler implements javax.xml.ws.handler.soap.SOAPHandler<javax.xml.ws.handler.soap.SOAPMessageContext> 
{ 
    private String myXML; 
    public String getMyXML() 
    { 
     return myXML; 
    } 
    ... 
    public boolean handleMessage(SOAPMessageContext context) 
    { 
     ... 
     myXML = this.getRawXML(context.getMessage()); 
    } 

    //elsewhere in the application: 
    ... 
    myService.doSomething(someRequest); 
    for (Handler h: ((BindingProvider)myService).getBinding().getHandlerChain()) 
    { 
     if (h instanceof CustomSOAPHandler) 
     { 
      System.out.println("HandlerResult: "+ ((CustomSOAPHandler)h).getMyXML()); 
     } 
    } 

W bardzo prostych testów, to wydaje się działać. Ale to rozwiązanie wydaje się trochę jak tani hack. Nie lubię ustawiania surowego XML jako członka obsługi łańcucha i mam przeczucie, że to narusza wiele innych najlepszych praktyk. Czy ktoś ma bardziej elegancki sposób robienia tego?

+0

Czy można ustawić obiekt DOM w HttpSession? – davidfmatheson

+0

@davidfmatheson: Może, ale dlaczego miałbym używać obiektu DOM zamiast łańcucha, czego tak naprawdę chcę? – FrustratedWithFormsDesigner

Odpowiedz

1

Rozwiązaniem było użycie JAXB do konwersji obiektów z powrotem do XML. Tak naprawdę nie chciałem tego robić, ponieważ wydaje się zbyteczne, aby klient sieci otrzymał kod XML, przekonwertował go na POJO, tylko aby ten POJO był konwertowany z powrotem do XML, ale działa.

3

Dwie opcje, które wydawały się działać dla mnie, są udokumentowane here. Nie otrzymałem jeszcze odpowiedzi na temat tego, czy używanie ThreadLocal było dobre, czy nie, ale nie widzę powodu, dla którego nie powinno być.

Moja metoda secoond, która została dodana do pierwotnego pytania, to przejście do przewodnika. Podczas debugowania objaśnienia WS zauważyłem, że mapa wywołaniaProperties zawierała odpowiedź SOAP jako część wewnętrznej struktury pakietu w obiekcie responseContext, ale okazało się, że nie można się do niej dostać. Kontekstem odpowiedzi był zestaw par wartości nazwy. Jednak po przeczytaniu kodu źródłowego dla ResponseContext pod numerem this location, zobaczyłem, że kod metody get miał komentarz o zwracaniu wartości null, jeśli nie mógł znaleźć właściwości Application Scoped, w przeciwnym razie odczytałby ją z właściwości invocationProperties pakietu, która wydawało się, że tego chciałem. W związku z tym zdecydowałem się ustawić zakres na parę klucz/wartość (Google: ustawienie właściwości scope-aplikacji dla jaxws), że kontekst ją wprowadził nisko-i-zobaczyłem, to było w specyfikacji jax-ws, do której się odwoływałem drugi wątek.

Zrobiłem też trochę czytania o pakiecie, https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html.

Mam nadzieję, że to ma dla ciebie sens. Obawiałem się, że trzy nie będą niczym w użyciu JAXB przeciwko, gdyby połączenie z serwisem spowodowało błąd mydła i naprawdę chciałem go zarejestrować, ponieważ był on zwracany z bramki płatności, która do dziś ma numer nieudokumentowanych wyników.

Powodzenia.

Powiązane problemy