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

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

1. 使用步骤

1.0 引入依赖

<dependency>    
    <groupId>com.thoughtworks.xstream</groupId>   
    <artifactId>xstream</artifactId>   
    <version>1.4.11.1</version>
 </dependency>

2. 0针对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.0 bean转xml

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Protobuf(Protocol Buffers)是一种轻量级的数据交换格式,它可以用于结构化数据的序列化和反序列化。而JavaBeanJava语言的一种编程规范,用于描述一个可重用的Java对象。 在将Protobuf与JavaBean进行互转时,可以通过以下几个步骤实现: 1. 定义Protobuf消息格式:首先需要定义一个.proto文件,其定义了消息的字段和类型。例如,定义一个Person消息包含name和age字段: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 2. 使用Protoc编译器生成Java类:使用Protoc编译器将.proto文件编译成对应的Java类。执行以下命令生成Java类: ``` protoc --java_out=<output_directory> <proto_file>.proto ``` 3. 将Protobuf消息换为JavaBean对象:使用生成的Java类,可以将Protobuf消息换为JavaBean对象。例如,将Person消息换为对应的JavaBean对象: ```java PersonProto.Person personProto = PersonProto.Person.newBuilder() .setName("John") .setAge(25) .build(); Person person = new Person(); person.setName(personProto.getName()); person.setAge(personProto.getAge()); ``` 4. 将JavaBean对象换为Protobuf消息:反过来,可以将JavaBean对象换为Protobuf消息。例如,将JavaBean对象换为Person消息: ```java Person person = new Person(); person.setName("John"); person.setAge(25); PersonProto.Person.Builder personProtoBuilder = PersonProto.Person.newBuilder() .setName(person.getName()) .setAge(person.getAge()); PersonProto.Person personProto = personProtoBuilder.build(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值