Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using JAXB with Google Android

Tags:

android

jaxb

I need to parse the java-objects which are passed through xml. I want to use for these purposes JAXB framework, because I have pre-annotated (using JAXB) java-class.

Is this possible in principle?

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

in line 4, I have a warning: "unable to resolve static method 282 JAXBContext ... " and then VM crashes

Any ideas on how to solve this problem?

like image 787
Dmytro Boichenko Avatar asked Mar 28 '11 15:03

Dmytro Boichenko


People also ask

What can I use instead of JAXB?

XOM, JDOM, dom4j, etc. etc. Projects like Castor and Apache XMLBeans predate JAXB, so you could have a look at those. Ulf Dittmer wrote: XOM, JDOM, dom4j, etc.

Is JAXB an API?

The Java™ Architecture for XML Binding (JAXB) provides an API and tools that automate the mapping between XML documents and Java objects. The JAXB framework enables developers to perform the following operations: Unmarshal XML content into a Java representation.

What is the purpose of JAXB API?

JAXB provides a fast and convenient way to marshal (write) Java objects into XML and unmarshal (read) XML into objects. It supports a binding framework that maps XML elements and attributes to Java fields and properties using Java annotations.


2 Answers

I'm not exactly resolving your problem, but JAXB isn't included in android by default and the library will cost you 9(!) MB of your apk. Try SimpleXML instead. It has similiar abilities and much more lightweight.

like image 81
Vladimir Ivanov Avatar answered Oct 06 '22 02:10

Vladimir Ivanov


I had the same problem of wanting to use a bunch of JAXB classes in the process of parsing XML (and, for me, JSON) web server responses.

I wrote up a wiki page for Parsing XML and JSON on Android, which describes a solution for this problem and guides you through step-by-step.

To be clear - I'd advise using JSON instead of XML on Android whenever possible. There are significant performance advantages for JSON.

To summarize my solution for using JAXB classes for both JSON and XML parsing:

I ended up stripping all annotations and javax.xml.* imports from the JAXB classes (slightly easier than re-annotating classes for SimpleXML - plus, you can also parse JSON responses) to create true POJOs, and then use Jackson with modified versions of the XML libraries that Jackson depends on.

The modification of the XML libraries is necessary because Android doesn't include required XML classes in the platform, and it will complain if you try to include classes in the protected javax.xml namespace as libraries in your project.

I stripped the XML annotations and imports manually initially, but then ended up automating the process via ant scripts.

Luckily, you can automate the XML library modification process. I wrote up a detailed post on Modifying XML libraries for Android (which the full tutorial references) which describes how to move the relevant classes into a new unprotected namespace using the Jar Jar Links utility.

If you want to use Jackson on Android, I've also created a modified version of the jackson-dataformat-android, aalto-xml, stax-api, and stax2-api projects for Android that you can feel free to use.

Here's a sample of what you would include in your pom.xml to include the dependencies 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> 

See this page for more details using these libraries.

You can download the JAR files from their respective directories here, if you want to include them directly in your project.

You can also check out the open-source "SIRI REST Client" app that uses these libraries for a working example.

EDIT

If you're using Gradle, your build.gradle would look like this:

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'     ...        } 
like image 36
Sean Barbeau Avatar answered Oct 06 '22 00:10

Sean Barbeau