在Kotlin中的android – Retrofit2 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) must mark a set or get method

这是获取的XML数据

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

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<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数据.所以我认为我的模型对象的声明是问题.

解决方法

这是同样的问题: kotlin data class + bean validation jsr 303

您需要使用Annotation use-site targets,因为属性上的注释的认值优先级为:

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

使用get或set 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
}

详见linked answer.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...