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

Quiero recuperar datos XML de la API y asignarlos al objeto modelo Kotlin usando Retrofit2 + SimpleXML en Kotlin.

Sin embargo, conseguí tal como el mensaje de error siguiente de SimpleXML.

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

Se trata de datos XML obtenidos

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

El objeto modelo Kotlin está por 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 como sigue.

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

Tengo el código de estado HTTP 200 y corrijo los datos XML. Así que creo que mi declaración de objeto modelo es un problema.

Este es el mismo problema que: kotlin data class + bean validation jsr 303

Es necesario utilizar los objetivos de sitio de uso de Anotación ya que el valor predeterminado para una anotación en una propiedad se prioriza de la siguiente manera:

  • Parámetro ( si se declaró en el constructor )
  • ( Si el sitio de destino permite, pero solo las anotaciones creadas por Kotlin pueden hacer esto )
  • Campo ( probablemente lo que sucedió 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 getter:

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

Vea la respuesta relacionada para los detalles.

No está familiarizado con la biblioteca SimpleXML, pero si su procesador de anotación está buscando métodos específicos para obtener y establecer, puede intentar configurar su clase 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 tipos de campo, puede utilizar 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 } 
  • Problema con Retrofit y simple - intento de hacer un lector de RSS para Android
  • SimpleXML Constructor Exception - No se puede crear Inner Class
  • Android - XML ​​serialization - simpleframework - Ruta con Elementos opcionales (required = false) - ¿Cómo ocultar valores nulos?
  • Marco XML simple en android, atributo de clase
  • Cómo analizar el XML de SimpleXML
  • Cómo port jaxb anotación a la biblioteca simpleXml?
  • Problema de velocidad de Android con la deserialización mediante SimpleXML
  • NullPointerException al usar el archivo XML en res / raw con Proguard
  • Cómo generar simple-xml java objeto anotado desde el esquema xsd
  • Uso de XML simple y obtención de NoClassDefFoundError en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.