2012-08-17 10 views
5

(seguito da questa domanda: Getting raw XML response from Java web service client)Come posso trasferire i dati da un gestore SOAP a un client Webservice?

Ho un gestore di messaggi SOAP che è in grado di ottenere il codice XML XML di una risposta al servizio web. Ho bisogno di ottenere questo XML nel client webservice in modo da poter eseguire alcune trasformazioni XSL sulla risposta prima di inviarlo sulla sua strada. Ho difficoltà a trovare un buon modo per ottenere dati da un gestore SOAP che cattura i messaggi in arrivo e rende disponibile l'XML raw a un client di servizio Web generato (da un WSDL). Qualche idea se questo è persino fattibile?


mi è venuta in mente qualcosa di simile:

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()); 
     } 
    } 

Nei test molto semplici, questo sembra funzionare. Ma questa soluzione sembra un po 'come un hack economico. Non mi piace impostare l'XML raw come membro del chain handler e ho la sensazione che questo violi molte altre best practice. Qualcuno ha un modo più elegante per farlo?

+0

È possibile impostare un oggetto DOM in HttpSession? – davidfmatheson

+0

@davidfmatheson: Forse, ma perché dovrei usare un oggetto DOM invece di una stringa, che è quello che voglio veramente? – FrustratedWithFormsDesigner

risposta

1

La soluzione era utilizzare JAXB per riconvertire gli oggetti in XML. Non volevo davvero farlo perché sembra ridondante che il client webservice riceva il codice XML, lo converta in un POJO, solo che il POJO venga riconvertito in XML, ma funziona.

3

Le due scelte che sembravano funzionare per me sono entrambe documentate here. Non ho ancora ricevuto una risposta sull'opportunità o meno di usare ThreadLocal, ma non vedo perché non dovrebbe esserlo.

Il mio metodo secoond che è stato aggiunto alla domanda originale era di percorrere il percorso del gestore. Durante il debug del callout WS, ho notato che la mappa invocationProperties aveva la risposta SOAP come parte di una struttura di pacchetto interna all'interno dell'oggetto responseContext, ma non sembrava esserci alcun modo di arrivarci. ResponseContext era un insieme di coppie di valori nominali. Tuttavia, quando ho letto il codice sorgente di ResponseContext su this location, ho visto che il codice per il metodo get aveva un commento sul ritorno di null se non era in grado di trovare una proprietà Application Scoped, altrimenti lo avrebbe letto dal pacchetto invocationProperties, che sembrava essere quello che volevo. Così ho cercato su come impostare l'ambito sulla coppia chiave/valore (Google: impostando la proprietà application-scope per jaxws) che il contesto lo stava introducendo in basso-ed-behold, era nella specifica jax-ws a cui ho fatto riferimento l'altro thread.

Ho anche letto qualcosa sul pacchetto, https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html.

Spero che questo abbia un senso per te. Ero preoccupato che tre non sarebbero stati nulla contro JAXB se la chiamata al servizio web avesse provocato un SOAP di sapone, e volevo davvero registrare questo pacchetto, dato che era stato restituito da un gateway di pagamento che ad oggi ha un numero di risultati non documentati.

Buona fortuna.

Problemi correlati