SpringBoot中使用xml与javaBean的互转及常见问题
1. 使用步骤
1.0 引入依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
2. 针对XML编写对于的实体,这里使用注解
XML文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<messageList>
<public>
<requestTime>20210825121212</requestId>
<requestUser>我是梁非凡</sendTime>
</public>
<curriculumList>
<curriculum>
<courseNo>100001</courseNo>
<achievement>100</achievement>
</curriculum>
<curriculum>
<courseNo>100002</courseNo>
<achievement>90</achievement>
</curriculum>
</curriculumList>
</messageList>
实体
@Data
@XStreamAlias("message")
public class UserMessage implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias("public")
private PublicMessage publicMessage;
@XStreamAlias("curriculumList")
private List<Curriculum> curriculumList;
@Data
@XStreamAlias("public")
public class PublicMessage implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias("requestTime")
private String requestTime;
@XStreamAlias("requestUser")
private String requestUser;
}
@Data
@XStreamAlias("curriculumList")
public class Curriculum {
@XStreamAlias("courseNo")
private String courseNo;
@XStreamAlias("achievement")
private String achievement;
}
涉及的主要注解
-
@XStreamAlias("courseNo")
为xml节点起别名,与xml的标签属性一致 -
@XStreamImplicit(itemFieldName="courseNo")
:标签属性为List
编写XML转JavaBean工具
public static <T> T xmlToBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStream();
//不使用默认的类加载器,需要手动设置类加载器
xstream.setClassLoader(cls.getClassLoader());
xstream.processAnnotations(cls);
xstream.allowTypesByRegExp(new String[] { ".*" });
Object obj = xstream.fromXML(xmlStr);
return (T) obj;
}
注意:
出现
.java.lang.ClassCastException
同一个实体不能转化
原因:因为在springboot项目中不是使用的默认classloader类加载器。
解决方法:
通过手动重设xtream的classloader。添加上面的代码
xstream.setClassLoader(cls.getClassLoader());
其中cls是实体转化的class;-
出现
com.thoughtworks.xstream.security.ForbiddenClassException: com.jt.bean.xml.ComconfigParse
的问题,原因:是Xsteam的安全权限校验机制
解决方法:
添加以下代码:
//为xml对应的实体类 xstream.allowTypes(new Class[]{No1.class, No2.class, No3.class});
在本例子对所有的class都赋予权限,所以使用了*;转化:
UserMessage userMessage = xmlToBean(xmlStr, UserMessage.class);
通过以上步骤实现了xml转bean的过程;其中xmlStr是xml的字符串;
bean转xml
比较简单调用
String xmlStr = xtrem.toXML(p)
方法即可;