2009-04-18 12 views
11

Qual è l'approccio migliore allo sviluppo di servizi Web; contratto prima o ultimo contratto?
Quali sono i vantaggi e gli svantaggi di ciascuno?Qual è l'approccio migliore ai servizi Web: prima il contratto o il contratto?

Con quale esperienza?

EDIT Questa domanda riguarda la realizzazione di un servizio web (leggi: SOAP) La questione è se le classi di implementazione devono essere codificati primo e il WSDL e schema XSD generato da quella (contratto ultima) o WSDL e XSD schema scritto prima e le classi di implementazione generato (contratto prima)

+0

Poiché la domanda si interroga sui vantaggi e gli svantaggi di ciascuna parte, non vedo che sia soggettiva. –

risposta

8

Contratto prima è la "migliore pratica" generalmente accettata.

ti fa essere molto chiaro sia con il produttore e consumatore del servizio esattamente ciò che è necessario e ciò che ci si aspetta. Questo diventa particolarmente importante quando inizi a provare a convertire i tipi java -> i tipi xml. Sei anche in grado di riutilizzare gli schemi attraverso diversi servizi web.

+0

Come si definisce qualcosa come uno stream nel proprio contratto per qualcosa come grandi upload di file? – Fireworks

+0

@Fireworks Non è necessario definirlo nel contratto, che è già uno standard. Uno può usare MIME (vecchio stile) o MTOM (il più spesso usato ora). – Raman

0

ho il sospetto che la risposta è un "dipende".

Il problema è che se si crea e si pubblica il contratto, si è vincolati da esso. Questo rende il cambiamento più difficile. non impossibile, ma più difficile.

D'altra parte, è più veloce di pasticciare con il contratto che con il codice, se sei a tuo agio con schemi ecc Così si può fare un certo cambiamento incrementale nel contratto.

Non ci sono anche strumenti che generano uno scheletro di codice dal WSDL? Sono quasi sicuro che ci siano. Se è così, si potrebbe fare bene a rendere gli schemi l'elemento "codice" e generare codice da esso.

+1

Ci sono questi strumenti. Nello spazio Java Apache Software Foundation e altri forniscono una serie di strumenti in grado di realizzare una generazione di codice. es. XMLBeans. Anche un numero di API può farlo. L'API JAXB riguarda esclusivamente il binding degli oggetti xml in Java e l'API JAX-WS include un tool wsimport, che analizza un WSDL e genera classi Java. –

6

Ho usato entrambi gli approcci. Il mio suggerimento è quello di utilizzare lo contratto prima schema, ma codice prima WSDL.

Scrivi file WSDL ha un sacco di sfumature strane come attacchi, porti e così via. Preferirei farlo con strumenti piuttosto che a mano. Ci sono strumenti che consentono di fare questo, ma nessuno di loro sono più semplici di

@WebService 
public ...

Per lo meno è possibile verificare la distribuzione.

Per lo schema, ho suggerito prima il contratto perché il linguaggio dello schema XML è molto più ricco di quello che è possibile descrivere in Java. Un esempio che di solito dò sta mostrando che XML Schema può limitare la dimensione di una stringa e applicare un modello di espressione regolare. Farlo in Java e le annotazioni sembrano un po 'più confuse.

Un altro vantaggio di fare lo schema di contratto di prima è la presenza di strumenti per convertire il vostro file di schema in documentazione HTML.

Lo strumento XJC può generare i file di classe necessari. Tuttavia, lo raccomanderei solo all'inizio.

Alla fine si dovrebbe prendere il file WSDL generato e lavorare con quello. In questo modo è possibile utilizzare wsimport e verificare che l'intera operazione da WSDL a Schema sia valida.

È possibile eseguire la distribuzione con il file WSDL utilizzando l'attributo wsdlLocation nell'implementazione @WebService e il server delle applicazioni correggerà i dati di associazione per gli utenti che richiedono il WSDL dal server, ma si conservano comunque le annotazioni. Altrimenti le annotazioni non verranno visualizzate nei file WSDL richiesti.

+0

Il tuo approccio ibrido è interessante, ma non mi è chiaro come lo hai messo in pratica. Per prima cosa create uno schema che descrive le classi di bean utilizzate dal WS, quindi create le classi con XJC, ma come usate questo schema in un WSDL generato? – Pino

+0

D'accordo, questo è molto utile. Spring-WS esegue questa operazione, ma fa un ulteriore passo avanti, eseguendo prima il contratto in base allo schema e generando il WSDL in fase di esecuzione quando viene richiesto WSDL. In questo modo, non si deve mai confondere il WSDL. – Raman

+0

@Pino usa solo le classi sul metodo del servizio. https://github.com/trajano/app/tree/master/app-web ha un esempio di questo. –