我想从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 }