2016-03-10 34 views
15

Desidero recuperare i dati XML dall'API e mapparlo all'oggetto del modello Kotlin utilizzando Retrofit2 + SimpleXML in Kotlin.Retrofit2 + SimpleXML in Kotlin: MethodException: L'annotazione deve contrassegnare un metodo set o get

Tuttavia, ho ricevuto il seguente messaggio di errore da SimpleXML.

org.simpleframework.xml.core.MethodException: Annotazione @ org.simpleframework.xml.Element (dati = false, name =, richiesto = true, type = void) deve segnare un set o ottenere metodo

si tratta di dati XML recuperati

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

Kotlin oggetto del modello è al di sotto

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

e APIClient sono i seguenti.

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

Ho ottenuto il codice di stato HTTP 200 e corretto i dati XML. Quindi penso che la mia dichiarazione di oggetto modello sia un problema.

+0

Eventuali duplicati di [Kotlin classe di dati + bean convalida JSR 303] (http://stackoverflow.com/questions/35847763/kotlin-data-class-bean-validation-jsr-303) –

risposta

19

questo è lo stesso problema: kotlin data class + bean validation jsr 303

È necessario utilizzare Annotation use-site targets poiché il valore predefinito per un'annotazione su una proprietà è ordine di priorità come:

  • parametro (se dichiarati nel costruttore)
  • proprietà (se il sito di destinazione consente , ma solo Kotlin ha creato annotazioni può fare questo)
  • campo (probabile cosa è successo qui, che non è quello che volevi).

Utilizzare l'obiettivo get o set per posizionare l'annotazione sul getter o sul setter. Qui è per il 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 
} 

Vedere la linked answer per i dettagli.

+6

Grazie per la tua risposta! Ho usato l'annotazione 'field: Element' e ho funzionato bene. – c8112002

0

non ha familiarità con la libreria SimpleXML ma se è il processore di annotazione è alla ricerca di specifici metodi get e set che si può provare a impostare la classe nel modo seguente:

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

Come pure, se il @ elemento annotazione supporta i tipi di campo si potrebbe usare questo approccio:

@Root(name="response") class User() { 
    @Element @JvmField var result:String?=null 
    @Element @JvmField var token:String?=null 
    @Element @JvmField var uid:String?=null 
} 
0
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 
} 
+0

Per favore leia https: // stackoverflow.blog/2009/07/23/non-english-question-policy/... Puoi usare https://en.stackoverflow.com/? –