Retrofit2 + SimpleXML в Kotlin: MethodException: Аннотация должна пометить метод set или get
Я хочу получить XML-данные из API и сопоставить их с объектом модели Kotlin, используя Retrofit2 + SimpleXML в Kotlin.
однако я получил следующее сообщение об ошибке от SimpleXML.
org.simpleframework.XML.ядро.MethodException: Аннотация @org.simpleframework.XML.Элемент (data=false, name=, required=true, type=void) должен пометить набор или получить метод
это извлеченные XML-данные
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<result code="0">Success</result>
<token>XXXXXXXXXXXXXXXXXXXX</token>
<uid>4294967295</uid>
</response>
объект модели Kotlin ниже
@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. Поэтому я думаю, что мое объявление объекта модели является проблемой.
3 ответов
это та же проблема, что и:класс данных kotlin + валидация бобов jsr 303
вам нужно использовать использовать-сайте Аннотация цели поскольку значение по умолчанию для аннотации свойства имеет приоритет:
- параметр (если объявлено в конструкторе)
- свойства (если целевой сайт позволяет, но только Kotlin созданные аннотации могут сделать это)
- поле (вероятно, то, что произошло здесь, а это не то, что вы хотели).
использовать get
или set
цель для размещения аннотации на геттере или сеттере. Вот он для геттера:
@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
}