Java: esempio di utilizzo della classe Holder in un webservice
Apache CXF - esempio di utilizzo della classe Holder
La classe Holder può essere utilizzata come input di un metodo di un webservice, ed è utile per poter restituire output multipli.
In sostanza è una variabile passata per riferimento ad un metodo di un webservice. In questo esempio il webservice è realizzato utilizzando Apache CXF.
Continuo dall’esempio precedente dove realizzavo un semplice webwervice con CXF.
La classe di cui stiamo parlando è questa:
javax.xml.ws.Holder;
Nel webservice di esempio era presente il metodo ping, che come unica cosa degna di nota restituiva la stringa “pong”. Ora aggiungiamo il metodo pingHolder che restituisce sempre la stringa “pong”, ma che segnala anche chi ha risposto al ping. Utilizzo un semplice bean Personaggio per rendere più emozionante la cosa.
Questa è l’interfaccia che descrive i due metodi, ping e pingHolder:
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.xml.ws.Holder; @WebService public interface PingPongService { @WebMethod(operationName = "ping") String ping( @WebParam(name = "Mittente") Personaggio mittente); @WebMethod(operationName = "pingHolder") String pingHolder( @WebParam(name = "Mittente") Personaggio mittente, @WebParam(name = "DestinatarioHolder", mode = WebParam.Mode.OUT, partName = "destinatario") Holder<Personaggio> destinatario); } |
Quindi questa è la defizione di una parametro di tipo Holder:
@WebParam(name = "DestinatarioHolder", mode = WebParam.Mode.OUT, partName = "destinatario") Holder<Personaggio> destinatario); |
La classe implementa l’interfaccia e fà il lavoro sporco è questa:
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebParam.Mode; import javax.jws.WebService; import javax.xml.ws.Holder; @WebService(endpointInterface = "it.nicola.test.PingPongService", serviceName = "PingPongService") public class PingPongServiceImpl implements PingPongService { @Override @WebMethod public String ping(Personaggio mittente) { return "pong"; } @Override @WebMethod(operationName = "pingHolder") public String pingHolder( @WebParam(name = "Mittente") Personaggio mittente, @WebParam(name = "destinatarioHolder", mode = Mode.OUT, partName = "destinatario") Holder<Personaggio> destinatario) { destinatario.value = new Personaggio(); destinatario.value.setNome("Paolino"); destinatario.value.setCognome("Paperino"); destinatario.value.setNickname("Zio Paperino"); return "pong"; } } |
L’oggetto “destinatario”, in ingresso al metodo, è null, quindi va istanziato prima di essere valorizzato.
Ecco come cambia la risposta del webservice utilizzando uno o l’altro:
Leave a Reply