2012-06-03 17 views
55

Ho lavorato a un servizio web REST utilizzando Jersey per alcuni giorni e sono riuscito a far funzionare tutte le operazioni CRUD, con diversi formati di scambio: XML, JSON, Google Protobuf.Problemi con WADL/XSD generato utilizzando Jersey con un approccio a contratto

Tuttavia, sto affrontando alcuni problemi relativi a WADL e XSD generati automaticamente.


Contesto

Per definire gli oggetti scambiati in questi tre formati, ho seguito un "contratto-primo" approccio:

  • da un XSD che ho scritto, ho generato il mio classi di modelli usando JAXB;
  • da un file proto equivalente che ho scritto, ho generato le classi di Google Protobuf (e internamente ho un modo per convertirle negli oggetti generati da JAXB, al fine di avere un modello unico).

Tuttavia, come vorrei i miei utenti di essere in grado di generare loro classi troppo, vorrei condividere questi file di schema (.xsd e Proto) e li hanno ben integrato con l'generata automaticamente WADL.

A tal fine, grazie a pagina this wiki:

  • mi hanno esposto le due file sotto
    • /schema/schema.xsd
    • /schema/schema.proto
  • Ho aggiunto un applicazione- file di grammatica:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <grammars xmlns="http://wadl.dev.java.net/2009/02" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
          xmlns:xi="http://www.w3.org/1999/XML/xinclude"> 
        <include href="../schema/schema.xsd" /> 
    </grammars> 
    
  • Ho aggiunto un generatore WADL personalizzato:

    public class RichWadlGeneratorConfig extends WadlGeneratorConfig { 
        @Override 
        public List<WadlGeneratorDescription> configure() { 
         return generator(WadlGeneratorApplicationDoc.class) 
          .prop("applicationDocsStream", "application-doc.xml") 
          .generator(WadlGeneratorGrammarsSupport.class) 
          .prop("grammarsStream", "application-grammars.xml") 
          .descriptions(); 
        } 
    } 
    

questo modo il sottostante appare nel WADL, quando colpito /rest/application.wadl:

<grammars> 
    <include href="../schema/schema.xsd"/> 
    <include href="application.wadl/xsd0.xsd"> 
      <doc title="Generated" xml:lang="en"/> 
    </include> 
</grammars> 

Problema

/rest/application.wadl/xsd0.xsd viene generato automaticamente dalle mie classi, ma è piuttosto diverso da quello che avevo inizialmente in schema.xsd. In aggiunta a ciò, chiamando uno strumento come wadl2java su questo WADL fallisce miseramente, presumibilmente perché

  • /schema/schema.xsd, e
  • /rest/application.wadl/xsd0.xsd

sono ora in conflitto (due definizioni per gli stessi oggetti).


Domande

  1. C'è un modo per disattivare la generazione e la diffusione di questo generato automaticamente XSD? (Come io non ne ho bisogno dato che sto seguendo questo approccio "contratto-prima")

  2. In caso contrario, c'è un modo per "override" il suo contenuto con il mio XSD scritto manualmente quando /rest/application.wadl/xsd0.xsd è colpito? (Googled intorno e trovato su WadlResource, per generare personalizzata WADL, ma non trovò nulla circa la generazione XSD stesso)


Grazie in anticipo per il vostro aiuto!

M.


Modifica

1) ho sollevato il problema al team Jersey e ha ottenuto una risposta: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8

2) ho sollevato un biglietto (JERSEY-1230) secondo le istruzioni di Pavel. Attualmente sto seguendo per presentare una correzione da solo o ottenere una correzione dal team di Jersey.

+2

è ora risolto, vedi http://java.net/jira/browse/JERSEY-1230 –

+0

si dovrebbe postare quanto sopra come risposta alla propria domanda e quindi accettarlo (per cancellarlo dalla lista Q senza risposta). – scottb

risposta

1

1.14-SNAPSHOT dovrebbe consentire di fare questo:

public class SampleWadlGeneratorConfig extends WadlGeneratorConfig { 

    @Override 
    public List<WadlGeneratorDescription> configure() { 
     return generator(WadlGeneratorApplicationDoc.class) 
       .prop("applicationDocsStream", "application-doc.xml") 
       .generator(WadlGeneratorGrammarsSupport.class) 
       .prop("grammarsStream", "application-grammars.xml") 
       .prop("overrideGrammars", true)        // !!! 
       .generator(WadlGeneratorResourceDocSupport.class) 
       .prop("resourceDocStream", "resourcedoc.xml") 
       .descriptions(); 
    } 

} 

quando overrideGrammars è impostato su true, Jersey generato grammatiche non saranno inclusi nel tornato WADL.

Il problema