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

前端之家收集整理的这篇文章主要介绍了在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相关文章