版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LuuvyJune/article/details/81455552
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
这个问题接上一篇 https://blog.csdn.net/LuuvyJune/article/details/81390206
报错原因:
服务端:public UserInfo getUserInfo(String token){
//业务处理
return userInfo;
}
这个方法返回的是一个对象,
客户端:String result = (String) call.invoke(object);接收的是一个字符串。
解决办法:(1)UserInfo implements Serializable 序列化
(2)getUserInfo(String token)这个方法,返回的时候,将对象转为json或者xml
转为json:
String json = com.alibaba.fastjson.JSON.toJSON(userInfo).toString();
return json;
或者
JSONObject json = JSONObject.fromObject(obj);//将java对象转换为json对象
String str = json.toString();//将json对象转换为字符串
接收端可这样处理:
JSONObject jsonObject=JSONObject.fromObject(objectStr);
UserInfo=(UserInfo)JSONObject.toBean(jsonObject, UserInfo.class);
转成XML形式:
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
//直接展示的方法
public String getUserInfo(String xml){
String xmlObj = "";
try {
//将获取的xml形式的参数转为java对象
JAXBContext context = JAXBContext.newInstance(UserInfo.class);//获取上下文对象
Unmarshaller marchaller = context.createUnmarshaller();
UserInfo userInfo = (UserInfo) marchaller.unmarshal(new StringReader(xml));
String token = userInfo.getToken();
if (null != token && !"".equals(token)) {
//如果token不为空,从缓存中获取username
String username = RedisCache.get(token);
if(null!=username && !"".equals(username)){
//根据账户查询userid
User user = userService.queryUserByLoginName(username);
userInfo.setUserId(user.getId());
// userInfo.setToken(token);
userInfo.setUserName(username);
//设置当前登录时间
userInfo.setLoginTime(System.currentTimeMillis());
//token有效期
userInfo.setExpireDate(2);
userInfo.setSuccess("ok");
}
}
//将对象转成xml的形式
Marshaller marshaller = context.createMarshaller(); // 根据上下文获取marshaller对象
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 设置编码字符集
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 格式化XML输出,有分行和缩进
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(userInfo, baos);
xmlObj = new String(baos.toByteArray()); // 生成XML字符串
} catch (JAXBException e1) {
e1.printStackTrace();
}
return xmlObj;
// String json = JSON.toJSON(userInfo).toString();
// return json;
}
userInfo.java需要加上标签:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 返回的对象
* @author
*
*/
@XmlRootElement(name="userInfo")
public class UserInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Long userId;
private String userName;
//认证凭证
private String token;
//当前登录时间
private long loginTime;
//token过期时间 单位小时
private Integer expireDate;
//成功标志
private String success;
public Long getUserId() {
return userId;
}
@XmlElement
public void setUserId(Long userId) {
this.userId= userId;
}
public String getUserName() {
return userName;
}
@XmlElement
public void setUserName(String userName) {
this.userName = userName;
}
public String getToken() {
return token;
}
@XmlElement
public void setToken(String token) {
this.token = token;
}
public long getLoginTime() {
return loginTime;
}
@XmlElement
public void setLoginTime(long loginTime) {
this.loginTime = loginTime;
}
public Integer getExpireDate() {
return expireDate;
}
@XmlElement
public void setExpireDate(Integer expireDate) {
this.expireDate = expireDate;
}
public String getSuccess() {
return success;
}
@XmlElement
public void setSuccess(String success) {
this.success = success;
}
}