2012-09-06 13 views
8

Sto utilizzando un Rest-Webservice in Android. Il Web Service potrebbe gestire JSON e XML, l'API è descritta come XSD. Quindi ho usato JAXB per generare classi dal XSD e poi ho usato il processore jackson JSON per generare JSON dalle mie istanze.Utilizzare le classi generate da JAXB (xjc) in Android

Il problema è che il JAXB (xjc) genera classi con le annotazioni JAXB e Android non è in grado di gestirle. Ho provato ad aggiungere il jaxb-api.jar al mio progetto Android ma il Dalvik non userà le classi di base.

Per la mia prima implementazione ho rimosso manualmente le annotazioni. Ma ora il XSD è stato aggiornato e non voglio farlo ogni volta che succede.

Avete qualche idea su come gestire questo problema in modo migliore? C'è la possibilità di usare jaxb/xjc senza annotazioni o c'è un altro generatore di codice che potrebbe fare questo? Conoscete un modo semplice per rimuovere le annotazioni dalle classi java (anche se sono stampate su più righe)? Esiste un'impostazione di progetto per i progetti AndroidEclipse, che rende il dalvik compatibile con le librerie di base?

thx, cathixx

risposta

2

ora, ho risolto da solo commentando tutte le annotazioni con il seguente ant script:

<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

questo sarebbe un grande aiuto per me se funziona. Tuttavia, sono nuovo di ant. Potresti dare un po 'più di contesto su come utilizzare questo script per qualcuno di nuovo alla formica? Ad esempio, ho una serie di file .java in una directory che deve essere convertita e ho installato una formica. Cosa succederà? –

5

ho dovuto fare un po 'più ricerca per rendere il lavoro la risposta di cathixx da quando ho' Sono nuovo ad Ant, quindi lo condividerò per aiutare gli altri.

Queste istruzioni prenderanno file Java con il codice come:

import javax.xml.bind.annotation.XmlElement; 

@XmlRootElement 
public class Response {... 

... e commentare questi eventi fuori, così sembra:

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

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

In primo luogo, creare un file build.xml (o qualunque cosa tu voglia chiamare, deve essere .xml) in un nuovo progetto Eclipse (un progetto "Generale" va bene).

Quindi, aggiungere il seguente testo al file 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> 

mettere i file *.java che si desidera commentare le importazioni XML e annotazioni per nella stessa directory del file build.xml.

Fare clic con il tasto destro del mouse sul file build.xml in Eclipse e fare clic su "Esegui come-> Ant Build".

Dovreste visualizzare un output simile:

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

... e le importazioni XML e le annotazioni dovrebbe essere commentata dei file.

Fatto!

Nota: se si desidera includere tutti i file *.java in tutte le sottodirectory della generazione.file XML (ad esempio, per commentare tutte le annotazioni XML/importazioni generati per un gruppo di classi JAXB in più pacchetti), cambiare il tag fileset a:

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

Quindi, prima di tutto, lavoro fantastico! Comunque sto incontrando alcuni problemi. Non esclude javax.xml.bind.JAXBElement. Alcuni pattern di XmlElementRefs sono commentati, vale a dire quando ci sono oggetti figli per qualche motivo. Alcuni XmlEnumValues ​​non sono commentati, ma altri lo sono. @XmlElements non lo è neanche. – spy

+0

Grazie! Per javax.xml.bind.JAXBElement, prova a rimuovere la parte ".annotation" dall'espressione regolare - non credo che la sua ricerca sia bassa (javax.xml.bind. *) Nella struttura del pacchetto. Per gli altri, non sono sicuro del perché a volte avrebbe funzionato per certe occorrenze e altre volte no. –

+0

@XmlRootElement sembra non essere prelevato – spy

Problemi correlati