项目中用到了xStream将对象封装成xml进行通讯的功能(这里用到了ksoap2-android-assembly-3.6.2-jar-with-dependencies.jar),测试一切都正常,将项目用AndroidStudio打包后发现app中总是连不上网,查看log有如下错误:
getMessageList: request xml ... <reqMsg>
operater>admin</operater>
<reqDetail>
<Kp>1</Kp>
<Kq>20</Kq>
</reqDetail>
</reqMsg>
12-05 16:59:42.678 17252-17339/? W/System.err: SoapFault - faultcode: 'soapenv:Server.userException' faultstring: 'com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field com.platform.app.service.xmlpo.ReqDetail.Kp
12-05 16:59:42.678 17252-17339/? W/System.err: ---- Debugging information ----
12-05 16:59:42.678 17252-17339/? W/System.err: field : Kp
12-05 16:59:42.678 17252-17339/? W/System.err: class : com.platform.app.service.xmlpo.ReqDetail
12-05 16:59:42.678 17252-17339/? W/System.err: required-type : com.platform.app.service.xmlpo.ReqDetail
12-05 16:59:42.678 17252-17339/? W/System.err: converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
12-05 16:59:42.678 17252-17339/? W/System.err: path : /reqMsg/reqDetail/Kp
12-05 16:59:42.678 17252-17339/? W/System.err: line number : 4
12-05 16:59:42.678 17252-17339/? W/System.err: class[1] : com.platform.app.service.xmlpo.ReqMsg
12-05 16:59:42.678 17252-17339/? W/System.err: version : null
12-05 16:59:42.678 17252-17339/? W/System.err: -------------------------------' faultactor: 'null' detail: org.kxml2.kdom.Node@23591981
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SourceFile:136)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.SoapEnvelope.parse(SourceFile:140)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.transport.Transport.parseResponse(SourceFile:129)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.transport.HttpTransportSE.parseResponse(SourceFile:304)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.transport.HttpTransportSE.call(SourceFile:276)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.transport.HttpTransportSE.call(SourceFile:118)
12-05 16:59:42.678 17252-17339/? W/System.err: at org.ksoap2.transport.HttpTransportSE.call(SourceFile:113)
12-05 16:59:42.678 17252-17339/? W/System.err: at com.hrmp.c.a$1$1.run(SourceFile:59)
12-05 16:59:42.678 17252-17339/? W/System.err: at java.lang.Thread.run(Thread.java:818)
发现请求的xml跟自己项目中的字段名字不一致,这里的Kp和Kq原本是PageSize和PageNum,再往下看发现ReqDetail 和 SoapSerializationEnvelope出现异常,回项目的ReqDetail的类查询一下果然,
利用xStream标记的类需要序列化,而开始的时候ReqDetail并没有实现Serializable接口的,因此在发起请求的时候出现了异常。
其实很容易判断,但是应该在写代码的时候就杜绝,因为XStream的原理就是用于序列化对象与 XML 对象之间的相互转换。