web-dev-qa-db-fra.com

Utilisation de JAXB avec Google Android

J'ai besoin d'analyser les objets Java qui sont passés via xml. Je veux utiliser à ces fins le cadre JAXB, car j'ai pré-annoté (en utilisant JAXB) la classe Java.

Est-ce possible en principe?

InputStream input = entity.getContent();
JAXBContext jc = JAXBContext.newInstance(new Class[] {Response.LoginResponse.class});
Unmarshaller un = jc.createUnmarshaller();
LoginResponse response = (LoginResponse)un.unmarshal(input);

à la ligne 4, j'ai un avertissement: "impossible de résoudre la méthode statique 282 JAXBContext ..." puis VM plante

Des idées sur la façon de résoudre ce problème?

30
Dmytro Boichenko

Je ne résout pas exactement votre problème, mais JAXB n'est pas inclus dans Android par défaut et la bibliothèque vous coûtera 9 (!) Mo de votre apk. Essayez SimpleXML à la place. Il a des capacités similaires et beaucoup plus léger.

25
Vladimir Ivanov

J'ai eu le même problème de vouloir utiliser un tas de classes JAXB dans le processus d'analyse des réponses du serveur Web XML (et, pour moi, JSON).

J'ai rédigé une page wiki pour l'analyse XML et JSON sur Android , qui décrit une solution à ce problème et vous guide pas à pas.

Pour être clair - je vous conseille d'utiliser JSON au lieu de XML sur Android chaque fois que possible. Il y a des avantages de performance significatifs pour JSON .

Pour résumer ma solution d'utilisation des classes JAXB pour l'analyse JSON et XML:

J'ai fini par supprimer toutes les annotations et javax.xml.* les importations à partir des classes JAXB (légèrement plus faciles que la ré-annotation des classes pour SimpleXML - en plus, vous pouvez également analyser les réponses JSON) pour créer de vrais POJO, puis utiliser Jackson avec modifié versions des bibliothèques XML dont Jackson dépend.

La modification des bibliothèques XML est nécessaire car Android n'inclut pas les classes XML requises dans la plateforme, et il se plaindra si vous essayez de inclure des classes dans l'espace de noms javax.xml protégé en tant que bibliothèques dans votre projet.

J'ai d'abord supprimé les annotations XML et les importations manuellement, mais j'ai fini par automatiser le processus via des scripts ant .

Heureusement, vous pouvez automatiser le processus de modification de la bibliothèque XML. J'ai rédigé un article détaillé sur Modification des bibliothèques XML pour Android (que le didacticiel complet référence) qui décrit comment déplacer les classes pertinentes dans un nouvel espace de noms non protégé en utilisant le Utilitaire Jar Jar Links .

Si vous souhaitez utiliser Jackson sur Android, j'ai également créé une version modifiée du jackson-dataformat-Android, aalto-xml, stax-api, et stax2-api projets pour Android que vous pouvez utiliser librement.

Voici un exemple de ce que vous incluriez dans votre pom.xml pour inclure les dépendances via Maven:

<dependencies>              
    <!-- Using Jackson for parsing -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.1.2</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.1.2</version>
    </dependency>   
    <!-- XML parsing  -->
    <!-- So many problems with XML and Android...
         Below XML libraries have been modified using JarJar
         and are NOT the same as their J2SE counterparts,
         hence the added "-Android" to the artifactId
         See:
         https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML-libraries-for-Android
      -->        
    <dependency>
        <groupId>edu.usf.cutr.Android.xml</groupId>
        <artifactId>jackson-dataformat-xml-Android</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.Android.xml</groupId>
        <artifactId>stax2-api-Android</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.Android.xml</groupId>
        <artifactId>stax-api-Android</artifactId>
        <version>1.0-2</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.Android.xml</groupId>
        <artifactId>aalto-xml-Android</artifactId>
        <version>0.9.8</version>
    </dependency>        
</dependencies>    

<repositories>
    <!-- CUTR Android XML libraries Releases -->
    <repository>
      <id>cutr-releases</id>
      <url>https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases</url>
    </repository>      
</repositories>

Voir cette page pour plus de détails sur l'utilisation de ces bibliothèques.

Vous pouvez télécharger les fichiers JAR à partir de leurs répertoires respectifs ici , si vous souhaitez les inclure directement dans votre projet.

Vous pouvez également consulter l'application open-source "SIRI REST Client" qui utilise ces bibliothèques pour un exemple de travail.

[~ # ~] modifier [~ # ~]

Si vous utilisez Gradle, votre build.gradle ressemblerait à ceci:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'Android'

repositories {
    mavenCentral()
    maven {
        // CUTR SNAPSHOTs
        url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/snapshots"
    }
    maven {
        // CUTR Releases
        url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases"
    }
}

Android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"
    ...
}

dependencies {
    ...
    // Normal Jackson libraries
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.2'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2'
    // Repackaged XML-specific libraries
    compile 'edu.usf.cutr.Android.xml:jackson-dataformat-xml-Android:2.1.2'
    compile 'edu.usf.cutr.Android.xml:stax2-api-Android:3.1.1'
    compile 'edu.usf.cutr.Android.xml:stax-api-Android:1.0-2'
    compile 'edu.usf.cutr.Android.xml:aalto-xml-Android:0.9.8'
    ...       
}
24
Sean Barbeau