2016-03-10 1 views
15

Я хочу получить XML-данные из API и сопоставить его с объектом модели Kotlin с помощью Retrofit2 + SimpleXML в Kotlin.Retrofit2 + SimpleXML в Kotlin: MethodException: аннотация должна отмечать метод set или get

Однако, я получил следующее сообщение об ошибке SimpleXML.

org.simpleframework.xml.core.MethodException: Аннотация @ org.simpleframework.xml.Element (данные = ложь, имя =, требуется = истина, тип = аннулируются) должен отметить набор или получить метод

Это неправдоподобные данные XML

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

Котлин модель объекта ниже

@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. Поэтому я считаю, что мое объявление объекта модели является проблемой.

+0

Возможный дубликат [Котлин класса данных + боб проверки JSR 303] (http://stackoverflow.com/questions/35847763/kotlin-data-class-bean-validation-jsr-303) –

ответ

19

Это та же проблема, как: kotlin data class + bean validation jsr 303

Вы должны использовать Annotation use-site targets, поскольку по умолчанию для аннотации на имущество является приоритетным как:

  • параметра (если они будут объявлены в конструкторе)
  • собственности (если целевой сайт позволяет , но только Котлин создал аннотации)
  • Поле (Возможно, что произошло здесь, что не то, что вы хотели).

Используйте 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 
} 

Смотрите linked answer для деталей.

+6

Спасибо за ваш ответ! Я использовал аннотацию 'field: Element', и она хорошо работала. – c8112002

0

Не знаком с библиотекой SimpleXML, но если это процессор аннотаций ищет конкретные получить и установить методы, которые вы можете попытаться установить свой класс следующим образом:

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

Как хорошо, если @ Элемент аннотацию поддерживает типы полей вы можете использовать этот подход:

@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

Por favor leia https: // stackoverflow.blog/2009/07/23/non-english-question-policy/... Можете ли вы использовать https://en.stackoverflow.com/? –