Usando JAXB con Google Android
(2)
No estoy resolviendo tu problema exactamente, pero JAXB no está incluido en Android de forma predeterminada y la biblioteca te costará 9 (!) MB de tu apk. Pruebe SimpleXML en su lugar. Tiene habilidades similares y mucho más ligero.
Necesito analizar los objetos Java que se pasan a través de xml. Quiero utilizar para estos fines 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 se bloquea VM
¿Alguna idea sobre cómo resolver este problema?
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 Parsing XML y JSON en Android , que describe una solución para este problema y lo guía paso a paso.
Para ser claros, recomendaría usar JSON en lugar de XML en Android siempre que sea posible. Hay ventajas de rendimiento significativas para JSON .
Para resumir mi solución para usar las clases de JAXB para el análisis JSON y XML:
Terminé eliminando todas las anotaciones y las importaciones javax.xml.*
De las clases de JAXB (algo más sencillo que volver a anotar las clases de SimpleXML - plus, también se pueden analizar las respuestas de JSON) para crear POJO 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 las clases XML necesarias en la plataforma, y se complain si intenta incluir clases en el espacio de nombres javax.xml protegido como bibliotecas en su proyecto.
Deshice las anotaciones e importaciones XML manualmente al principio, 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í una publicación detallada sobre complain (que contiene las referencias completas del tutorial) que describe cómo mover las clases relevantes a un nuevo espacio de nombres sin protección utilizando la herramienta Jar Jar Links .
Si desea utilizar Jackson en Android, también he creado una versión modificada de los proyectos jackson-dataformat-android
, aalto-xml
, stax-api
y stax2-api
para Android que puede usar de forma gratuita.
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 estas bibliotecas.
Puede descargar los archivos JAR de sus directorios respectivos here , si desea incluirlos directamente en su proyecto.
También puede consultar la aplicación de código abierto "Cliente SIRI REST" que utiliza estas bibliotecas para un 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''
...
}