Le risposte elencate qui che ti guidano da usare SOAPHandler
sono completamente corrette. Il vantaggio di questo approccio è che funzionerà con qualsiasi implementazione JAX-WS, poiché SOAPHandler fa parte delle specifiche JAX-WS. Tuttavia, il problema con SOAPHandler è che tenta implicitamente di rappresentare l'intero messaggio XML in memoria. Ciò può comportare un enorme utilizzo della memoria. Varie implementazioni di JAX-WS hanno aggiunto le proprie soluzioni alternative per questo. Se lavori con richieste di grandi dimensioni o risposte di grandi dimensioni, devi esaminare uno degli approcci proprietari.
Dato che chiedi "quello incluso in JDK 1.5 o superiore", risponderò rispetto a ciò che è formalmente noto come RI JAX-WS (aka Metro), che è incluso in JDK.
JAX-WS RI ha una soluzione specifica per questo che è molto efficiente in termini di utilizzo della memoria.
Vedi https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Sfortunatamente quel link ora è rotto ma lo puoi trovare su WayBack Machine. Darò i punti salienti di seguito:
La gente della Metro nel 2007 ha introdotto un ulteriore tipo di gestore MessageHandler<MessageHandlerContext>
, che è proprietario di Metro. È molto più efficiente di SOAPHandler<SOAPMessageContext>
come non tenta di eseguire la rappresentazione DOM in memoria.
Ecco il testo cruciale dell'articolo originale del blog:
messageHandler:
Utilizzando il framework estensibile del gestore fornito dalle specifiche JAX-WS e la migliore astrazione dei messaggi in RI, abbiamo introdotto un nuovo gestore chiamatoMessageHandler
per estendere le applicazioni del servizio Web. MessageHandler è simile a SOAPHandler, tranne per il fatto che le sue implementazioni hanno accessoMessageHandlerContext
(un'estensione di MessageContext). Tramite MessageHandlerContext è possibile accedere al Messaggio ed elaborarlo utilizzando l'API Message. Come ho inserito nel titolo del blog, questo gestore ti consente di lavorare su Message, che fornisce modi efficienti per accedere / elaborare il messaggio non solo un messaggio basato su DOM. Il modello di programmazione dei gestori è lo stesso e i gestori dei messaggi possono essere combinati con i gestori logici e SOAP standard. Ho aggiunto un esempio in JAX-WS RI 2.1.3 che mostra l'uso di MessageHandler per registrare i messaggi ed ecco un frammento dell'esempio:
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(fine citazione dal post del blog 2007)
Inutile dire che il tuo gestore personalizzato, LoggingHandler
nell'esempio, deve essere aggiunto alla catena del gestore per avere effetto. È come aggiungere qualsiasi altro Handler
, quindi puoi cercare nelle altre risposte in questa pagina come farlo.
Puoi trovare un esempio completo nel repository Metro GitHub .