WebServices: nudi vs incartati?

Genero alcuni servizi Web da alcuni wsdl esistenti

Io uso Maven per farlo, ma alcuni servizi web sono generati con

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 

e gli altri con

 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

Jaxb o xjc lo fa automaticamente? perché non ho alcuna differenza in wsdls …

I webservices BARE vengono generati quando il nome “operation”, il nome “message” e il nome “element” sono diversi in una forma o in una forma. Per generare automaticamente il tuo client o stub di servizio come WRAPPED, tutti questi tre elementi devono essere uguali.

La soluzione è scrivere i propri stub e utilizzare le annotazioni @ RequestWrapper / @ ResponseWrapper.

PS: tutte le operazioni portType devono avere una richiesta / risposta in stile ‘avvolto’. Anche la minima deviazione e verrà impostato su BARE.

Questa discussione al Java Ranch Forum lo ha chiarito per me. In particolare questo esempio fatto da Jason Irwin :

Interfaccia generata dal client BARE (usando wsimport):

 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public interface IMathServer { @WebMethod @WebResult(name = "addNumsResponse") public AddNumsResponse addNums(@WebParam(name = "addNums") AddNums parameters); } 

Interfaccia generata dal client WRAPPED (utilizzando wsimport):

 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) public interface IMathServer { @WebMethod @WebResult(name = "addNumsResponse") public int addNums(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2); } 

Queste due parti di codice generano lo stesso messaggio:

    1 2    

Come detto da R Srini nella stessa discussione, ciò che è avvolto sono i parametri, non il codice.

L’unica differenza che genera i client è il modo in cui creerai i parametri nel client, ma entrambi genereranno lo stesso messaggio (con o senza wrapper) a seconda del servizio WSDL.

Con BARE avrai solo un elemento superiore (parametro) con “sotto-parametri” all’interno. Questo uno BARE verrà inviato direttamente (senza “avvolgendolo”). Mentre con WRAPPED avrai tutti questi “sotto-parametri” nel primo livello, e il client li avvolgerà automaticamente in un altro elemento superiore.

Citando Jason Irwin:

È stato passato un solo parametro (“addNums”) ed era “Bare” nel corpo. Nel secondo, i parametri erano “nudi” nel codice, ma “avvolti” in fase di esecuzione da JAX-WS.

Spero che questo ti aiuti!

Specifica in che modo i parametri del metodo, che corrispondono alle parti del messaggio in un contratto WSDL, vengono inseriti nel corpo del messaggio SOAP. Uno stile di parametro di BARE indica che ogni parametro è inserito nel corpo del messaggio come elemento figlio della radice del messaggio. Uno stile di parametro di WRAPPED significa che tutti i parametri di input sono racchiusi in un singolo elemento su un messaggio di richiesta e che tutti i parametri di output sono racchiusi in un singolo elemento nel messaggio di risposta. Se si imposta lo stile su RPC, è necessario utilizzare lo stile del parametro WRAPPED.

Rif. http://cxf.apache.org/docs/developing-a-service.html