java - Problemas con WADL/XSD generado usando Jersey con un enfoque de primer contrato
contract-first (1)
1.14-SNAPSHOT debería permitirle hacer 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, las gramáticas generadas por Jersey no se incluirán en WADL devuelto.
He estado trabajando en un servicio web REST usando Jersey por unos días y logré que todas las operaciones CRUD funcionen, con varios formatos de intercambio: XML, JSON, Google Protobuf.
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 el enfoque de "contratar primero" :
- de un XSD que escribí, genere mis clases modelo usando JAXB;
- de un archivo proto equivalente que escribí, genere 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 también puedan generar sus clases , me gustaría compartir estos archivos de esquema (.xsd y .proto) y tenerlos bien integrados con el WADL generado automáticamente .
Para eso, gracias a this página wiki:
- He expuesto los dos archivos bajo
/schema/schema.xsd
-
/schema/schema.proto
He agregado un archivo de aplicación-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 agregado un generador de 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, a continuación aparece en el WADL, cuando toco /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 miserablemente, presumiblemente porque
-
/schema/schema.xsd
, y -
/rest/application.wadl/xsd0.xsd
ahora son conflictivos (dos definiciones para los mismos objetos).
Preguntas
¿Hay alguna forma de desactivar la generación y difusión de este XSD generado automáticamente? (Como no lo necesito ya que estoy siguiendo este enfoque de "contratar primero")
De lo contrario, ¿hay alguna forma de "anular" su contenido con mi XSD escrito manualmente cuando se
/rest/application.wadl/xsd0.xsd
? (Busqué en Google y encontré sobre WadlResource, para generar WADL personalizado, pero no encontré nada sobre la generación de XSD)
¡Gracias de antemano por tu ayuda!
METRO.
Editar
1) Planteé el problema al equipo de Jersey y obtuve una respuesta: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8
2) Levanté un boleto (JERSEY-1230), de acuerdo con las instrucciones de Pavel. Actualmente estoy haciendo el seguimiento para enviar una corrección yo mismo o para obtener una solución del equipo de Jersey.