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创建的注释可以做到这一点 )
- ( 可能发生在这里,这不是你想要的 )。
使用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 }
查看链接的答案的细节。
不熟悉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 }
- 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
- UNRESOLVED_REFERENCE未解决的参考:isInitialized
- Datepicker:如何在点击edittext时popupdatepicker
- 为什么不在Kotlin的Android 4.x下运行应用程序?
- RecyclerView不可滚动,并且项目单击不在导航抽屉recyclerview中工作
- 如何从Firebase中的表中同步获取所有行?
- 在kotlin的片段
- Kotlin for循环
- 无法将Kotlin Android扩展程序添加到我的项目中