原来的工具类实践中发现,当不同实体对象具有相同注解别名时,xml转化为实体,无法找到正确的实体进行转化。比如下面两个实体别名都叫resultInfo,采用xmlToBean方法时,发生错误程序无法找到正确的实体,只有一个别名时,不会出现错误。改进后,采用现在的方法,不再将所有的实体统一注册,采用每次调用时注册一次,并将实体的class进行指定,不依靠默认的实体,调用一切正常。
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* deleteUsers 返回信息
* success:删除成功的用户数
* failure:删除失败的用户数
* @author Administrator
*
*/
@XStreamAlias("resultInfo")
public class DeleteUsersResult {
private int success;
private int failure;
public int getSuccess() {
return success;
}
public void setSuccess(int success) {
this.success = success;
}
public int getFailure() {
return failure;
}
public void setFailure(int failure) {
this.failure = failure;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
*
* @author Administrator
* addOrUpdateUser 返回信息
*/
@XStreamAlias("resultInfo")
public class AddOrUpdateUserResult {
private AddOrUpdateUser user;
public AddOrUpdateUser getUser() {
return user;
}
public void setUser(AddOrUpdateUser user) {
this.user = user;
}
}
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* XStream工具类
* @author guo
* 2018年8月8日
*/
public class XStreamUtil {
/**
* java 转换成xml
* @Title: beanToXml
* @Description: TODO
* @param obj 对象实例
* @return String xml字符串
*/
public static String beanToXml(Object obj){
System.out.println("XStream:beanToXml开始");
XStream xstream=new XStream();
如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +xstream.toXML(obj);
}
/**
* 将传入xml文本转换成Java对象
* @Title: xmlToBean
* @Description: TODO
* @param xmlStr
* @param cls xml对应的class类
* @return T xml对应的class类的实例对象
*
* 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
*/
@SuppressWarnings("unchecked")
public static <T> T xmlToBean(String xmlStr,Class<T> cls){
//注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
XStream xstream=new XStream(new DomDriver());
xstream.processAnnotations(cls);
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[]{cls});
T obj=(T)xstream.fromXML(xmlStr);
return obj;
}