2012-06-03 14 views
55

He estado trabajando en un servicio web REST utilizando Jersey durante unos días y he logrado que todas las operaciones CRUD funcionen, con varios formatos de intercambio: XML, JSON, Google Protobuf.Problemas con WADL/XSD generado usando Jersey con un enfoque de primer contrato

Sin embargo, estoy enfrentando algunos problemas relacionados con WADL y XSD generados automáticamente.


Contexto

Para definir los objetos intercambiados en estos tres formatos, he seguido un "contrato-primero":

  • de un XSD que escribí, me genera mi clases modelo usando JAXB;
  • de un archivo de protocolo equivalente que escribí, generé las clases de Google Protobuf (e internamente tengo una forma de convertirlas a los objetos generados por JAXB, para tener un único modelo).

Sin embargo, como me gustaría que mis usuarios para poder generan sus clases también, me gustaría compartir estos archivos de esquema (.xsd y .proto) y hacer que bien integrado con la generada automáticamente WADL.

Para ello, gracias a la página wiki: this

  • me han expuesto los dos archivos en
    • /schema/schema.xsd
    • /schema/schema.proto
  • He añadido una aplicación- archivo de gramática:

    <?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> 
    
  • he añadido un generador WADL personalizado:

    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(); 
        } 
    } 
    

De esta manera el siguiente aparece en la WADL, cuando golpeo /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 se genera automáticamente desde mis clases, pero es bastante diferente de lo que inicialmente tenía en schema.xsd. Además de eso, llamar a una herramienta como wadl2java en este WADL falla estrepitosamente, presumiblemente porque

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

ahora están en conflicto (dos definiciones para los mismos objetos).


Preguntas

  1. ¿Hay una manera de desactivar la generación y difusión de este XSD generado de forma automática? (Como yo no lo necesito ya que estoy siguiendo este enfoque "contrato-primero")

  2. Si no, ¿hay una manera de "anular" su contenido con mi XSD escrito manualmente cuando es golpeado /rest/application.wadl/xsd0.xsd? (Googled alrededor y se encontró sobre WadlResource, para generar WADL personalizado, pero no encontró nada sobre la propia generación XSD)


Gracias de antemano por su ayuda!

M.


Editar

1) me planteó la cuestión al equipo Jersey y recibió una respuesta: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8

2) Levanté un billete (JERSEY-1230) de acuerdo con las instrucciones de Pavel Actualmente estoy haciendo un seguimiento para enviar una solución yo mismo o para obtener una solución del equipo de Jersey.

+2

problema se ha solucionado ahora, consulte http://java.net/jira/browse/JERSEY-1230 –

+0

debe publicar lo anterior como respuesta a su propia pregunta y luego acéptelo (para borrarlo de la lista de Q sin responder)) – scottb

Respuesta

1

1.14-SNAPSHOT debe permitir que hagas esto:

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(); 
    } 

} 

cuando overrideGrammars se establece en true, Jersey genera gramáticas no se incluirán en WADL devuelto.

Cuestiones relacionadas