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.