Ответ 1
Я не совсем разрешаю вашу проблему, но JAXB по умолчанию не включен в android, и библиотека будет стоить вам 9 (!) МБ вашего apk. Попробуйте SimpleXML. Он обладает сходными способностями и гораздо более легким.
Мне нужно разобрать 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 сбой
Любые идеи о том, как решить эту проблему?
Я не совсем разрешаю вашу проблему, но JAXB по умолчанию не включен в android, и библиотека будет стоить вам 9 (!) МБ вашего apk. Попробуйте SimpleXML. Он обладает сходными способностями и гораздо более легким.
У меня возникла такая же проблема с тем, что я хочу использовать кучу классов 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'
...
}