Retrofit2 + Kotlin中的SimpleXML:MethodException:注释必须标记一个set或get方法

我想从API中获取XML数据,并使用Kotlin中的Retrofit2 + SimpleXML将其映射到Kotlin模型对象。

但是,我从SimpleXML得到如下错误信息。

org.simpleframework.xml.core.MethodException:Annotation @ org.simpleframework.xml.Element(data = false,name =,required = true,type = void)必须标记一个set或get方法

这是提取的XML数据

  Success XXXXXXXXXXXXXXXXXXXX 4294967295  

下面是Kotlin模型对象

 @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 } val retrofit = Retrofit.Builder() .baseUrl(baseURL) .addConverterFactory(SimpleXmlConverterFactory.create()) .build() val call = retrofit.create(MyService::class.java).getUser() call.enqueue(object: Callback { override fun onResponse(p0: Call?, response: Response?) { val response = response?.body() } override fun onFailure(p0: Call?, t: Throwable?) { Log.e("APIClient", t?.message) } 

我得到了HTTP状态码200和正确的XML数据。 所以我认为我的模型对象的声明是问题。

这是同样的问题: kotlin数据类+ beanvalidationjsr 303

您需要使用Annotation使用站点目标,因为属性注释的默认优先级为:

  • 参数如果在构造函数中声明
  • 属性如果目标网站允许,但只有Kotlin创建的注释可以做到这一点
  • 可能发生在这里,这不是你想要的 )。

使用getset target将注释放在getter或setter上。 这里是吸气剂:

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

查看链接的答案的细节。

不熟悉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 } 

另外,如果@Element注解支持字段types,则可以使用这种方法:

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