Uso de JAXB con Google Android


Necesito analizar los objetos java que se pasan a través de xml. Quiero usar para estos propósitos JAXB framework, porque he pre-anotado (usando JAXB) java-class.

Es esto posible en principio?

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

En la línea 4, tengo una advertencia: "no se puede resolver el método estático 282 JAXBContext ... " y luego VM se bloquea

¿Alguna idea sobre cómo resolver este problema?

Author: Bo Persson, 2011-03-28

2 answers

No estoy resolviendo exactamente su problema, pero JAXB no está incluido en Android por defecto y la biblioteca le costará 9 (!) MB de su apk. Pruebe SimpleXML en su lugar. Tiene habilidades similares y mucho más ligero.

 23
Author: Vladimir Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-28 15:19:03

Tuve el mismo problema de querer usar un montón de clases JAXB en el proceso de analizar las respuestas del servidor web XML (y, para mí, JSON).

Escribí una página wiki para Analizar XML y JSON en Android , que describe una solución para este problema y lo guía paso a paso.

Para ser claro - yo aconsejaría el uso de JSON en lugar de XML en Android siempre que sea posible. Existen ventajas de rendimiento significativas para JSON.

Para resumir mi solución para usar clases JAXB para el análisis JSON y XML:

Terminé eliminando todas las anotaciones y las importaciones javax.xml.* de las clases JAXB (un poco más fácil que volver a anotar las clases para SimpleXML-plus, también puede analizar las respuestas JSON) para crear POJOs verdaderos, y luego usar Jackson con versiones modificadas de las bibliotecas XML de las que depende Jackson.

La modificación de las bibliotecas XML es necesaria porque Android no incluye clases XML obligatorias en la plataforma, y se quejará si intenta incluir clases en el javax protegido.espacio de nombres xml como bibliotecas en su proyecto.

Eliminé las anotaciones XML e importé manualmente inicialmente, pero luego terminé automatizando el proceso a través de scripts ant.

Afortunadamente, puede automatizar el proceso de modificación de la biblioteca XML. Escribí un post detallado en Modificando bibliotecas XML para Android (que el tutorial completo hace referencia) que describe cómo mover las clases relevantes a un nuevo espacio de nombres desprotegido usando la utilidad Jar Jar Links.

Si quieres usar Jackson en Android, también he creado una versión modificada de la jackson-dataformat-android, aalto-xml, stax-api, y stax2-api proyectos para Android que puedes usar libremente.

Aquí hay una muestra de lo que incluiría en su pom.xml para incluir las dependencias a través de 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>

Vea esta página para más detalles usando estos biblioteca.

Puede descargar los archivos JAR de sus respectivos directorios aquí, si desea incluirlos directamente en su proyecto.

También puede consultar la aplicación de código abierto "SIRI REST Client" que utiliza estas bibliotecas como ejemplo de trabajo.

EDITAR

Si estás usando Gradle, tu build.gradle se vería así:

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'
    ...       
}
 23
Author: Sean Barbeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:08