Подтвердить что ты не робот

Использование JAXB с Google Android

Мне нужно разобрать java-объекты, которые передаются через xml. Я хочу использовать для этих целей структуру JAXB, потому что у меня есть предварительный аннотированный (с использованием JAXB) Java-класс.

Возможно ли это в принципе?

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

в строке 4, у меня есть предупреждение: "невозможно разрешить статический метод 282 JAXBContext..." а затем VM сбой

Любые идеи о том, как решить эту проблему?

4b9b3361

Ответ 1

Я не совсем разрешаю вашу проблему, но JAXB по умолчанию не включен в android, и библиотека будет стоить вам 9 (!) МБ вашего apk. Попробуйте SimpleXML. Он обладает сходными способностями и гораздо более легким.

Ответ 2

У меня возникла такая же проблема с тем, что я хочу использовать кучу классов JAXB в процессе анализа ответов веб-сервера XML (и, для меня, JSON).

Я написал страницу wiki для Анализ XML и JSON на Android, в котором описывается решение этой проблемы, за шагом.

Чтобы быть ясным - я бы посоветовал использовать JSON вместо XML на Android по возможности. значительные преимущества для JSON.

Обобщение моего решения для использования классов JAXB для анализа JSON и XML:

В итоге я удалил все аннотации и javax.xml.* импорт из классов JAXB (немного проще, чем повторять аннотирование классов для SimpleXML - plus, вы также можете анализировать ответы JSON) для создания истинных POJO, а затем используйте Jackson с измененными версиями библиотек XML, от которых зависит Джексон.

Модификация библиотек XML необходима, потому что Android не включает в себя необходимые классы XML в платформе, и жаловаться, если вы попробуйте включить классы в защищенное пространство имен javax.xml в качестве библиотек в вашем проекте.

Я вручную удалил аннотации XML и импортировал их вручную, но затем закончил автоматизацию процесса с помощью скриптов ant.

К счастью, вы можете автоматизировать процесс изменения библиотеки XML. Я написал подробный отчет о Изменение XML-библиотек для Android (в котором приведен полный справочник), в котором описывается, как переместить соответствующие классы в новый незащищенное пространство имен с помощью утилиты Jar Jar Links.

Если вы хотите использовать Jackson на Android, я также создал измененную версию проектов jackson-dataformat-android, aalto-xml, stax-api и stax2-api для Android, которые вы можете использовать.

Вот пример того, что вы включили бы в свой pom.xml, чтобы включить зависимости через 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>

Подробнее об использовании этих библиотек см. эту страницу.

Вы можете загрузить JAR файлы из своих соответствующих каталогов здесь, если вы хотите включить их непосредственно в свой проект.

Вы также можете проверить приложение "Клиент SIRI REST", которое использует эти библиотеки для рабочего примера.

ИЗМЕНИТЬ

Если вы используете Gradle, ваш build.gradle будет выглядеть следующим образом:

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'
    ...       
}