0
点赞
收藏
分享

微信扫一扫

PBR材质纹理下载

秀儿2020 2024-01-19 阅读 31

Spring boot项目实现java bean和xml互转

项目场景:

工作中需要给下游第三方收费系统做数据挡板,由于下游系统使用的是soap webservice,里面涉及各种xml跟bean的互转,在此介绍一下使用的方法。
基于springboot搭建webservice的过程将会在下篇博客介绍


互转方法

这里介绍两种方法.

  • 使用jackson进行互转,Spring boot项目自带的jsonbean的互转的框架,他其实还有xmlbean的互转。
  • 使用jaxws进行xmlbean的互转

使用jackson进行互转

  • gradle引入
implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-xml')
  • maven 引入
		<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.13.5</version>
        </dependency>
  • 可以做成一个通用的XMLUtils工具类,代码如下:
	public static String javaBean2Xml(Object javaBean) throws JsonProcessingException {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.setDefaultUseWrapper(false);
        //字段为null就自动忽略,不再序列化
        xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //XML标签名:使用骆驼命名的属性名,
        xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE);
        //设置转换模式,就是根据getter、setter方法,设置为第一个字母小写这种
        xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
        return xmlMapper.writeValueAsString(javaBean);
    }

    public static <T> T Xml2javaBean(String javaBean, Class<T> tClass) throws JsonProcessingException {

            XmlMapper xmlMapper = new XmlMapper();
            xmlMapper.setDefaultUseWrapper(false);
            //字段为null,自动忽略,不再序列化
            xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            //XML标签名:使用骆驼命名的属性名,
            xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE);
            //设置转换模式,就是根据getter、setter方法,设置为第一个字母小写这种
            xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
            return xmlMapper.readValue(javaBean, tClass);
    }
  • POJO类,后续都会用这个做例子
public class Student {
    private String name;
    private String teacher;
    private Integer age;
    ....省略构造函数和getter和setter
}
  • 测试案例
public static void main(String[] args) throws JsonProcessingException {
    Student student = new Student("张三","张老师", 26);
    String s = XMLUtils.javaBean2Xml(student);
    System.out.println(s);
    System.out.println(XMLUtils.Xml2javaBean(s, Student.class));
}

结果:
在这里插入图片描述

  • 可能会出现的bug
  • 如果想给POJO的属性的XML起个别名怎么办,jackson是提供了相关的注解。

其他的可以自己尝试下,如果是List的集合的,是以一对多的一对应的,一里面定义了XML节点,就以一里面的定义为主。

  • 补充完整的依赖,和Spring Boot已经引入的依赖。

    • 完整依赖
      <dependency>
          <groupId>com.fasterxml.jackson.dataformat</groupId>
          <artifactId>jackson-dataformat-xml</artifactId>
          <version>2.13.5</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.13.5</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.13.5</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.13.5</version>
      </dependency>
      
    • Spring Boot已经引入的依赖,以2.6.12为例
      在这里插入图片描述

使用jaxws进行xmlbean的互转

  • 老规矩,工具类
	public static String beanToXml (Object obj, Class<?> zlass) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(zlass);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        StringWriter writer = new StringWriter();
        marshaller.marshal(obj,writer);
        return writer.toString();
    }
    public static <T> T xmlToBean (String xml, Class<T> zlass) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(zlass);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Object object = unmarshaller.unmarshal(new StringReader(xml));
        return (T) object;
    }
  • Marshaller 接口中还定义了5个属性,分别是:
  • 代码
public static void main(String[] args) throws Exception {
    Student student = new Student("张三","张老师", 26);
    String s = XMLUtils.beanToXml(student, Student.class);
    System.out.println(s);
    System.out.println(XMLUtils.xmlToBean(s, Student.class));
}
  • 测试
    在这里插入图片描述
  • 最后补充几个注解

搞定收工!

举报

相关推荐

0 条评论