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.

3 Solutions collect form web for “Retrofit2 + SimpleXML en Kotlin: MethodException: La anotación debe marcar un método set o get”

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 } 
  • Android - XML ​​serialization - simpleframework - Ruta con Elementos opcionales (required = false) - ¿Cómo ocultar valores nulos?
  • NullPointerException al usar el archivo XML en res / raw con Proguard
  • Cómo generar simple-xml java objeto anotado desde el esquema xsd
  • Cómo analizar el XML de SimpleXML
  • No se puede crear un conversor para mi clase en Android Retrofit2 converter-simplexml library
  • Android, org.simpleframework.xml Existencia de persistencia, Elemento 'foo' ya se utiliza
  • Uso conveniente de Android XmlResourceParser?
  • @Namespace en Android SimpleXml
  • SimpleXML falla en Lenovo P90
  • Atributo "vacío" no funciona como se esperaba con SimpleFramework
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.