2012-09-06 26 views
8

Estoy usando un Rest-Webservice en Android. El Web Service podría manejar JSON y XML, la API se describe como XSD. Así que usé JAXB para generar clases desde el XSD y luego usé el procesador jackson JSON para generar JSON desde mis instancias.Usar clases generadas JAXB (xjc) en android

El problema es que JAXB (xjc) genera clases con anotaciones JAXB y Android no puede manejarlas. Traté de agregar el jaxb-api.jar a mi proyecto de Android pero el Dalvik no usará las clases principales.

Para mi primera implementación eliminé manualmente las anotaciones. Pero ahora se actualizó el XSD y no quiero hacer esto cada vez que esto sucede.

¿Tiene alguna idea de cómo manejar este problema de una mejor manera? ¿Existe la posibilidad de usar jaxb/xjc sin anotaciones o hay otro generador de código que podría hacer esto? ¿Conoces una manera fácil de eliminar anotaciones de las clases de Java (incluso si están impresas en varias líneas)? ¿Existe una configuración de proyecto para los proyectos AndroidEclipse, que hace que el dalvik permita las librerías centrales?

THX, cathixx

Respuesta

2

ahora, lo resuelto por mí mismo comentando todas las anotaciones con la siguiente ant guión:

<replaceregexp flags="g" byline="false"> 
    <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)"/> 
    <substitution expression="/*\1*/\3"/> 
    <fileset dir="path/to/files"> 
    <include name="*.java"/> 
    </fileset> 
</replaceregexp> 
+0

Esto sería una gran ayuda para mí si funciona. Sin embargo, soy nuevo para la hormiga. ¿Podría darnos un poco más de contexto sobre cómo usar este script para alguien nuevo en hormiga? Por ejemplo, tengo un conjunto de archivos .java en un directorio que necesita ser convertido, y tengo una hormiga instalada. ¿Qué sigue? –

5

que tenía que hacer alguna investigación adicional para hacer el trabajo respuesta de cathixx desde que' Soy nuevo para Ant, así que lo compartiré para ayudar a otros.

Estas instrucciones se llevarán a archivos Java con código como:

import javax.xml.bind.annotation.XmlElement; 

@XmlRootElement 
public class Response {... 

... y comentar estos hechos, por lo que parece:

/*import javax.xml.bind.annotation.XmlElement;*/ 

/*@XmlRootElement*/ 
public class Response {... 

En primer lugar, crear un archivo build.xml (o como lo quiera llamar, debe ser .xml) en un nuevo proyecto de Eclipse (un proyecto "General" está bien).

A continuación, agregue el texto siguiente al archivo build.xml:

<?xml version="1.0"?> 
<project 
    name="CommentOutXmlAnnotations" 
    basedir="." 
    default="commentOutXmlAnnotations" > 

<!-- This Ant script comments out the following lines from the Java files in this directory: 
    import javax.xml.bind.annotation.*; 
    @Xml* 
--> 
    <target 
     name="commentOutXmlAnnotations"   
     description="Run" > 
      <replaceregexp 
       byline="false" 
       flags="g" > 
       <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)" /> 
       <substitution expression="/*\1*/\3" /> 
       <fileset dir="." > 
        <include name="*.java" /> 
       </fileset> 
      </replaceregexp>   
    </target> 
</project> 

poner el *.java archivos que desea comentar las importaciones XML y anotaciones para en el mismo directorio que el archivo build.xml.

Haga clic derecho en el archivo build.xml en Eclipse, y haga clic en "Ejecutar como-> Ant Build".

Debería ver una salida como:

Buildfile: D:\Eclipse_Projects\StripAnnotations\build.xml 
commentOutXmlAnnotations: 
BUILD SUCCESSFUL 
Total time: 403 milliseconds 

... y las importaciones XML y las anotaciones deben comentada de sus archivos.

¡Hecho!

Nota: si desea incluir todos los archivos *.java en todos los subdirectorios de la compilación.archivo XML (por ejemplo, para comentar todas las anotaciones XML/importaciones generadas por un montón de clases JAXB en varios paquetes), cambian la etiqueta fileset a:

<fileset dir="." > 
    <include name="**/*.java" /> 
</fileset> 
+0

¡Antes que nada, trabajo increíble! Sin embargo, estoy teniendo algunos problemas. No filtra javax.xml.bind.JAXBElement. Algunos patrones de XmlElementRefs están comentados, es decir, cuando hay objetos secundarios por algún motivo. Algunos valores XmlEnumValues ​​no están comentados, pero otros sí lo están. @XmlElements tampoco lo es. – spy

+0

¡Gracias! Para javax.xml.bind.JAXBElement, intente eliminar la parte ".annotation \" de la expresión regular. No creo que su búsqueda sea tan baja (javax.xml.bind. *) En la estructura del paquete. Para los demás, no estoy seguro de por qué a veces funcionaría para ciertas ocurrencias y otras veces no. –

+0

@XmlRootElement no parece recogido – spy

Cuestiones relacionadas