2012-09-06 7 views
8

Ich verwende eine Rest-Webservice in Android. Die Web Service könnte JSON und XML behandeln, die API wird als XSD beschrieben. Also habe ich JAXB verwendet, um Klassen aus der XSD generieren und dann habe ich Jackson JSON Prozessor verwendet, um JSON von meinen Instanzen zu generieren.Verwenden Sie JAXB (xjc) generierte Klassen in Android

Das Problem ist, dass JAXB (xjc) generiert Klassen mit JAXB Annotationen und Android kann nicht mit denen umgehen. Ich habe versucht, die jaxb-api.jar zu meinem Android-Projekt hinzuzufügen, aber der Dalvik wird keine Kernklassen verwenden.

Für meine erste Implementierung habe ich die Annotationen manuell entfernt. Aber jetzt wurde die XSD aktualisiert und ich möchte dies nicht jedes Mal tun, wenn dies passiert.

Haben Sie eine Idee, wie Sie dieses Problem besser lösen können? Gibt es eine Möglichkeit, jaxb/xjc ohne Anmerkungen zu verwenden oder gibt es einen anderen Code-Generator, der dies tun könnte? Kennen Sie eine einfache Möglichkeit, Anmerkungen aus Java-Klassen zu entfernen (auch wenn sie in mehreren Zeilen gedruckt sind)? Gibt es eine Projekteinstellung für AndroidEclipse Projekte, die den Dalvik erlauben, Core-Bibliotheken zuzulassen?

thx, cathixx

Antwort

2

jetzt, ich löste es von mir durch alle Anmerkungen mit folgendem ant Skript zu kommentieren:

<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

Dies wäre eine große Hilfe für mich sein, wenn es funktioniert. Ich bin jedoch neu in der Ameise. Könntest du ein wenig mehr Kontext dafür geben, wie man dieses Skript für jemanden benutzt, der neu zu Ant ist? Zum Beispiel habe ich eine Reihe von .java-Dateien in einem Verzeichnis, die konvertiert werden müssen, und ich habe ant installiert. Was als nächstes? –

5

ich forschen etwas mehr zu tun hatte cathixx Antwort Arbeit zu machen, da ich Ich bin neu bei Ant, also teile ich das, um anderen zu helfen.

Diese Anweisungen nehmen Java-Dateien mit Code wie:

import javax.xml.bind.annotation.XmlElement; 

@XmlRootElement 
public class Response {... 

... und diese Vorkommnisse auf Kommentar, so dass es wie folgt aussieht:

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

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

Erstellen Sie zunächst eine Datei build.xml (oder wie auch immer Sie es nennen möchten - muss .xml sein) in einem neuen Eclipse Projekt (ein "General" Projekt ist in Ordnung).

Dann fügen Sie den folgenden Text in die Datei 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> 

Setzen Sie die *.java Dateien Sie die XML-Import und Anmerkungen für im selben Verzeichnis wie die Datei build.xml kommentieren möchten.

Klicken Sie mit der rechten Maustaste auf die Datei build.xml in Eclipse und klicken Sie auf "Ausführen als-> Ant Build".

sollten Sie eine Ausgabe wie:

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

... und der XML-Import und Anmerkungen sollten aus Ihren Dateien kommentiert werden.

Fertig!

Hinweis: Wenn Sie alle *.java Dateien in allen Unterverzeichnissen des Builds einschließen möchten.XML-Datei (zum Beispiel kommentieren Sie alle XML-Annotationen/Importe für eine Reihe von JAXB-Klassen in mehreren Paketen erzeugt), ändern Sie den fileset Tag:

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

Also vor allem, tolle Arbeit! Ich stoße jedoch auf ein paar Probleme. Es filtert javax.xml.bind.JAXBElement nicht aus. Einige Muster von XmlElementRefs sind auskommentiert, wenn aus irgendeinem Grund untergeordnete Objekte vorhanden sind. Einige XmlEnumValues ​​sind nicht auskommentiert, aber andere sind. @ XmlElements ist auch nicht. – spy

+0

Danke! Versuchen Sie für javax.xml.bind.JAXBElement, den Teil ".annotation" aus dem regulären Ausdruck zu entfernen. Ich glaube nicht, dass er in der Paketstruktur nach low (javax.xml.bind. *) Sucht. Für die anderen ist es nicht sicher, warum es manchmal für bestimmte Ereignisse funktioniert und zu anderen Zeiten nicht. –

+0

@XmlRootElement scheint nicht abgeholt zu werden – spy