微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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.

原文地址:https://www.jb51.cc/android/313404.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐