Intereting Posts
Как получить массив объектов в результате веб-службы KSOAP в Android? Вложенные экраны предпочтений теряют Почему preferences.getString («ключ», «ПО УМОЛЧАНИЮ») всегда возвращает «ПО УМОЛЧАНИЮ»? Как импортировать проект андроида в качестве библиотеки и НЕ компилировать его как apk (Android studio 1.0) Как настроить listview с помощью baseadapter Как преобразовать формат ISO8601 в миллисекунды? Android: Appcompat 21 как добавить тень на панель действий Счетчик шагов в Android: всегда включен? Службы Google Play и «Нет связанного приложения, связанного с этим идентификатором клиента» Как настроить макет, когда появляется мягкая клавиатура Использование Alarmmanager для запуска службы в определенное время Пример поля Realm Auto Increment Как запустить намерение карты с маркером / наложением на заданной широте и долготе? Устанавливать вес (в процентах) программно Как остановить ВНУТРЕННУЮ прокрутку WebView в Android?

Retrofit2 + SimpleXML в Kotlin: MethodException: аннотация должна отмечать набор или метод get

Я хочу получить XML-данные из API и сопоставить их с объектом модели Kotlin, используя Retrofit2 + SimpleXML в Kotlin.

Однако я получил следующее сообщение об ошибке SimpleXML.

Org.simpleframework.xml.core.MethodException: Annotation @ org.simpleframework.xml.Element (data = false, name =, required = true, type = void) должен отмечать набор или метод get

Это извлеченные XML-данные

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response> <result code="0">Success</result> <token>XXXXXXXXXXXXXXXXXXXX</token> <uid>4294967295</uid> </response> 

Объект модели Котлин ниже

 @Root(name = "response") public class User() { @Element public var result: String? = null @Element public var token: String? = null @Element public var uid: String? = null } 

И APIClient выглядит следующим образом.

 interface MyService { @GET("/testLogin.xml") fun getUser(): Call<User> } val retrofit = Retrofit.Builder() .baseUrl(baseURL) .addConverterFactory(SimpleXmlConverterFactory.create()) .build() val call = retrofit.create(MyService::class.java).getUser() call.enqueue(object: Callback<User> { override fun onResponse(p0: Call<User>?, response: Response<User>?) { val response = response?.body() } override fun onFailure(p0: Call<User>?, t: Throwable?) { Log.e("APIClient", t?.message) } 

Я получил код статуса HTTP 200 и исправил данные XML. Поэтому я считаю, что мое объявление объекта модели является проблемой.

Solutions Collecting From Web of "Retrofit2 + SimpleXML в Kotlin: MethodException: аннотация должна отмечать набор или метод get"

Это та же проблема, что и класс данных kotlin + проверка бонуса jsr 303

Необходимо использовать целевые объекты целевого использования Annotation, поскольку по умолчанию для аннотации для свойства задается приоритет как:

  • Параметр ( если объявлен в конструкторе )
  • Свойство ( если целевой сайт допускает, но только созданные Kotlin аннотации могут это сделать )
  • Поле ( вероятно, что здесь произошло, чего вы не хотели ).

Используйте get или set target для размещения аннотации на геттере или сеттере. Вот он для геттера:

 @Root(name = "response") public class User() { @get:Element public var result: String? = null @get:Element public var token: String? = null @get:Element public var uid: String? = null } 

См. Связанный ответ для деталей.

Не знакомы с библиотекой SimpleXml, но если это обработчик аннотаций ищет конкретные методы get и set, вы можете попробовать настроить свой класс следующим образом:

 @Root(name="response") class User() { var result:String?=null @Element get @Element set var token:String?=null @Element get @Element set var uid:String?=null @Element get @Element set } 

Кроме того, если аннотация @Element поддерживает типы полей, вы можете использовать этот подход:

 @Root(name="response") class User() { @Element @JvmField var result:String?=null @Element @JvmField var token:String?=null @Element @JvmField var uid:String?=null } 
 To avoid the error in parse do one should place annotation tags @set e @get @Root(name = "response", strict = false) public class User() { @set:Element(name = "result") @get:Element(name = "result") public var result: String? = null @set:Element(name = "token") @get:Element(name = "token") @Element public var token: String? = null @set:Element(name = "uid") @get:Element(name = "uid") public var uid: String? = null }