SpringBoot中使用xml与javaBean的互转及常见问题

2,143 阅读1分钟

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;
}

涉及的主要注解

  1. @XStreamAlias("courseNo")为xml节点起别名,与xml的标签属性一致
  2. @XStreamImplicit(itemFieldName="courseNo") :标签属性为List

3.0 编写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;
    }

注意:

  1. 出现.java.lang.ClassCastException 同一个实体不能转化 原因:因为在springboot项目中不是使用的默认classloader类加载器。 解决方法: 通过手动重设xtream的classloader。添加上面的代码 xstream.setClassLoader(cls.getClassLoader());其中cls是实体转化的class;

  2. 出现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的字符串;

4.0bean转xml

比较简单调用 String xmlStr = xtrem.toXML(p)方法即可;