2011-05-29 15 views
5

Sto creando alcuni servizi utilizzando JAX-RS che devono prendere in oggetti arbitrariamente complessi come argomenti, non solo primitive come interi e stringhe. A discussion on the CXF mailing list dice di usare solo un oggetto wrapper come parametro singolo in questo caso.Creare e collegare XSD a un WADL

La mia preoccupazione è come documentare il formato di input per il servizio? Se la creazione di un servizio che sembra qualcosa di simile al seguente:

@POST 
@Produces("application/json") 
@Consumes("application/json") 
@Path("oneParam") 
public ComplexObject2 myServiceMethod(ComplexObject1 obj) { 
    Foo f = obj.foo 
    Bar b = obj.bar 
    ... 
} 

il WADL generato automaticamente che CXF produce produrrà solo le seguenti:

<resource path="/oneParam"> 
    <method name="POST"> 
     <request> 
      <representation mediaType="application/json"/> 
     </request> 
     <response> 
      <representation mediaType="application/json"/> 
     </response> 
    </method> 
</resource> 

Questo contiene alcuna informazione su ciò che la richiesta o la risposta in realtà contiene. Sergey sulla mailing list CXF diceva che era possibile collegare uno schema alla rappresentazione, ma come dovrei farlo? E come posso creare l'XSD?

(PS L'uso del POST per le risorse idempotenti potrebbe non essere RESTful, ma non è importante in questo caso poiché in pratica si utilizza RPC con Json. Questo è più o meno un clone 1: 1 di un'API basata su SOAP esistente.)

+0

Lo schema è per aiutare gli sviluppatori a scoprire cosa viene inviato e restituito, non necessariamente per convalidare l'output di una macchina. Quindi questo vale per xml e non JSON non è così importante per me. – oligofren

risposta

6

È possibile collegare un file XSD in un file WADL e quindi fare riferimento a un elemento XML nella rappresentazione per richieste e risposte. Tuttavia, poiché è uno schema XML, non si applica alle rappresentazioni JSON.

Per collegare un XSD a un file WADL, creare un elemento grammars nella parte superiore del file prima dell'elemento principale resources.

<grammars> 
    <include href="myapp.xsd"/> 
</grammars> 

quindi aggiungere un riferimento a un elemento XML come segue (utilizzando una versione modificata del vostro esempio):

<resource path="/oneParam"> 
    <method name="POST"> 
     <request> 
      <representation mediaType="application/xml" element="myapp:oneParamRequest" /> 
     </request> 
     <response> 
      <representation mediaType="application/xml" element="myapp:oneParamResponse" /> 
     </response> 
    </method> 
</resource> 

Il prefisso myapp è definita nel XSD e può essere utilizzato nel file WADL anche.

Non so per configurare CXF per farlo automaticamente. La mia esperienza con Jersey è simile e usiamo il WADL generato come punto di partenza per il montaggio manuale più tardi.

+0

Grazie! Non ho alcuna possibilità di verificarlo ora, ma sembra proprio la cosa di cui ho bisogno. Non ho idea di come configurare CXF, ma la vita trova un modo :) – oligofren