2010-02-05 13 views
29

Utilizziamo l'approccio "start from Java" per creare servizi Web JAX-WS 2.0 utilizzando lo stack Metro 1.5. Quando puntiamo uno strumento standard come SoapUI in uno dei nostri servizi web indica che i parametri di WebMethods sono facoltativi. Il xsd generato mostra minOccurs = 0.Come posso rendere necessario un parametro WebMethod

Ho bisogno di un modo per rendere necessari i parametri WebMethod (forse minOccurs = 1 in xsd) nell'approccio "start from Java". Penserei che ci sia un'annotazione Java per questo, ma non sono stato in grado di trovarne uno. L'annotazione XmlElement ha un attributo obbligatorio, ma XmlElement non può essere applicato ai parametri WebMethod.

C'è un modo per rendere necessari i miei parametri WebMethod, a meno di modificare manualmente xsd e impostare minOccurs su 1?

risposta

28

Ho verificato che Metro 2.0 consente di impostare @XmlElement(required=true) su un parametro. Lo xsd generato non ha minOccurs=0. Lascia minOccurs fuori dalla XSD generato in modo che assume il valore di default 1.

È inoltre necessario aggiornare il JDK mettendo il JAX-WS 2.2 webservices-api.jar nella directory endorsed/.

Ho pubblicato la stessa domanda on the Java forums.

Grazie a jitu per entrambi la risposta e sottolineando che minOccurs si imposta su 1 in modo da lasciarlo fuori da .xsd ha l'effetto desiderato.

Quando @XmlElement (required = true) è impostato sul parametro SoapUI non indica più il parametro come facoltativo.

6

Il file xsd generato mostra minOccurs = 0.

Questo è per specifica: tutti i non primitivi sono facoltativi, sono necessarie solo le primitive.

Ho bisogno di un modo per rendere necessari i parametri WebMethod (forse minOccurs = 1 in xsd) nell'approccio "start from Java".

Questo non è possibile, a meno che non si utilizzino le primitive come accennato in precedenza.

E in realtà, questo è uno dei motivi per cui Java fa schifo (sì, agli sviluppatori piace ma it just does not work): è fragile, il contratto può cambiare (!), Non ti dà tutto il controllo di cui hai bisogno , non è fit well with WS-Security, ecc. Quindi, in effetti, contract-first non è piacevole, ma almeno funziona.

+0

Grazie per i commenti e i collegamenti. Vorrei che quei libri di servizi web gonfiati là fuori (alcuni dei quali ho letto - intendo waded attraverso) avrebbero appena detto questo chiaramente come avete. –

+0

@Dean Prego. E grazie per il feedback su JAX-WS 2.2 (anche se questo non era proprio nella portata della domanda iniziale). –

+2

Direi che il WSDL-first non funziona ugualmente. Il blog a cui ti colleghi parla dell'utilizzo di oggetti Request e Return complessi per il wrapping, ma questo presenta una serie di problemi, come nascondere le cose richieste nei campi sottostanti, l'abuso del riutilizzo, ecc ... quindi, ancora una volta, terrei un esempio di qualcosa di buono come l'utilizzo di Spring e dei proxy per rendere qualcosa come un WebService come una semplice implementazione di un'interfaccia localmente. Assorbire l'interfaccia locale in questo modo fa parte di ciò che ti impedisce di dimenticare che è un servizio che * accade * essere esposto tramite JAX-WS. – jcalvert

2

Ecco un'altra discussione su questa stessa domanda. Secondo la risposta Metro 2.0 supporta l'inserimento di @XmlElement su un parametro di metodo che dovrebbe risolvere il mio problema.

http://forums.java.net/jive/thread.jspa?messageID=385565&#385565

Metro 2.0 è stato rilasciato il 10 Dic 2009 in modo che non è più in EA. Farò un tentativo e vedere se funziona.

Problemi correlati