Retrofit2 + SimpleXML en Kotlin: MethodException: la anotación debe marcar un set o método get

Quiero get datos XML de la API y asignarlos al object model de Kotlin utilizando Retrofit2 + SimpleXML en Kotlin.

Sin embargo, recibí el siguiente post de error de SimpleXML.

org.simpleframework.xml.core.MethodException: Annotation @ org.simpleframework.xml.Element (data = false, name =, requinetworking = true, type = void) debe marcar un set o método get

Esto es capturado datos XML

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

El object model Kotlin está debajo

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

y APIClient es el siguiente.

 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) } 

Obtuve el código de estado HTTP 200 y corrijo los datos XML. Entonces creo que mi statement de object model es un problema.

    Este es el mismo problema que: class de datos kotlin + validation de frijol jsr 303

    Debe utilizar los objectives del sitio de uso de anotación ya que el valor pnetworkingeterminado para una anotación en una propiedad se prioriza como:

    • parámetro ( si está declarado en el constructor )
    • propiedad ( si el sitio de destino lo permite, pero solo las annotations creadas por Kotlin pueden hacerlo )
    • campo ( probablemente lo que pasó aquí, que no es lo que quería ).

    Use get o set target para colocar la anotación en el getter o setter. Aquí está para el comprador:

     @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 } 

    Ver la respuesta vinculada para más detalles.

    No está familiarizado con la biblioteca SimpleXml, pero si su procesador de annotations está buscando methods específicos de obtención y configuration, puede intentar configurar su class de la siguiente manera:

     @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 } 

    Además, si la anotación @Element admite types de campo, puede usar este enfoque:

     @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 }