Spring boot项目java bean和xml互转

news2024/11/15 8:42:49

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

  • 项目场景:
  • 互转方法
    • 使用`jackson`进行互转
    • 使用`jaxws`进行`xml`与`bean`的互转
  • 搞定收工!

项目场景:

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


互转方法

这里介绍两种方法.

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

使用jackson进行互转

因为Spring Boot 项目其他依赖基本上都会引入,只是缺少一个依赖com.fasterxml.jackson.dataformat:jackson-dataformat-xml,所以只需要引入这一个依赖即可。

  • 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

在使用jackson去进行转换的时候,POJO类不管几个构造函数,一定要有无参构造,否则就会报错。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of Student (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

  • 如果想给POJO的属性的XML起个别名怎么办,jackson是提供了相关的注解。
  • @JacksonXmlRootElement
    namespace属性:用于指定XML根元素命名空间的名称。
    localname属性:用于指定XML根元素节点标签的名称。
  • @JacksonXmlProperty
    namespace和localname属性用于指定XML命名空间的名称,isAttribute指定该属 性作为XML的属性()还是作为子标签().
  • @JacksonXmlText注解将属性直接作为未被标签包裹的普通文本。
  • @JacksonXmlCData将属性包裹在CDATA标签中。
  • 集合元素的映射
    @JacksonXmlElementWrapper可以将列表数据转为XML节点。
    useWrapping属性设置是否设置外围标签名,默认true

其他的可以自己尝试下,如果是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的互转

使用起来基本是跟jackson差不多的。好处就是jdk自己就有提供,不需要引入额外的工具包,主要是使用javax下的 JAXBContext 接口,利用MarshallerUnmarshaller接口来进行xmlbean的互转。
但是需要注意的是

  • 必须要提供无参构造器,否则会报错com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Student没有无参数默认构造器。
  • 必须在类上提供@javax.xml.bind.annotation.XmlRootElement,否则会报错javax.xml.bind.MarshalException
    -with linked exception:
    [com.sun.istack.SAXException2: 由于类型 “Student” 缺少 @XmlRootElement 注释, 无法将该类型编集为元素]
  • 如果不提供@javax.xml.bind.annotation.XmlElement注解,那么所产生的XML节点均为属性值,就是小写。
  • @javax.xml.bind.annotation.XmlElement定义的值不能跟getter方法一起出现,否则会报错com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    类的两个属性具有相同名称 “name”
  • 老规矩,工具类
	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个属性,分别是:
  • JAXB_ENCODING
    这个属性是设置编码集,
    marshaller.setProperty(Marshaller.JAXB_ENCODING, “GBK”);
  • JAXB_FORMATTED_OUTPUT
    这个属性是是否格式化生成的xml串 true-格式化,false-不格式化
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  • JAXB_SCHEMA_LOCATION
    指定xsi:schemaLocation,它定义了XML Namespace和对应的XSD(Xml Schema Definition)文档的位置的关系。它的值由一个或多个URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的XML Namespace的值,第二个URI给出Schema文档的位置,Schema处理器将从这个位置读取Schema文档,该文档的targetNamespace必须与第一个URI相匹配。
    marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, “xxx.xxx.xxx”);
  • JAXB_NO_NAMESPACE_SCHEMA_LOCATION
    如果没有Namespeace,但是需要使用Schema,就需要用到JAXB_NO_NAMESPACE_SCHEMA_LOCATION,它可以指定将放置在已编组 XML 输出中的 xsi:noNamespaceSchemaLocation 属性值
    marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, “xxx.xxx.xxx”);
  • JAXB_FRAGMENT
    是否省略xml头信息()true-省略,false-不省略
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
  • 代码
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));
}
  • 测试
    在这里插入图片描述
  • 最后补充几个注解
  • @XmlRootElement
    类级别的注解,这个注解为根节点的注解,加在类上面,而且为必要的注解,如果没有此注解,执行beanToXml方法时将会报异常。这个根节点默认名字为类名,但是可以设置name属性来修改根节点名字。namespace属性可以用于指定生成的元素所属的命名空间。
  • @XmlElement
    字段,方法级别的注解,将java类的属性映射为xml的一个结点。一般使用在属性上,或者get方法上,其中常用的属性有name、nillable、namespace、defaultValue。name可以设置结点的名称;nillable 指定文本是否可以为空,true-可以为空,false-不可以为空,默认为false,如果设置为true,则该字段为空是,这个结点也会生成,但是值为空,如果是指为false,则该结点不生成;namespace属性可以用于指定生成的元素所属的命名空间;defaultValue 可以设置该结点的默认文本。
  • @XmlTransient
    类,字段,方法级别的注解。当添加这个注解后,这个属性或者类将不进行映射。需要注意的是该注解与所有其他JAXB注解相互排斥.
  • @XmlAccessorType
    类级别注解,其中有一个value属性,值为XmlAccessType的枚举类。
    1.XmlAccessType.PROPERTY 加这个value表示,会将所有拥有get方法和set方法的属性(必须2个方法都有,否则不映射)映射成xml,除非加入@XmlTransient则不会映射,如果没有get/set方法,则需要再属性上加上@XmlElement。
    2.XmlAccessType.FIELD
    这个属性是将类中非静态的属性都映射到xml中,并且不需要加get/set方法
    3.XmlAccessType.PUBLIC_MEMBER
    这个属性值,是@XmlAccessorType的默认默认值,它会将属性为public的属性或者get/set方法同时为public的属性映射成xml。
    4.XmlAccessType.NONE
    这个属性表示任何属性都不会被映射到xml中,除非使用其他注解,如@XmlElement
  • @XmlAccessorOrder
    类级别的注解。控制生成属性映射xml结点的顺序。其中有一个value属性,可以设置排序方式,XmlAccessOrder.ALPHABETICAL 为按照字母顺序进行排序, XmlAccessOrder.UNDEFINED按照属性顺序进行排序,默认为XmlAccessOrder.UNDEFINED
  • @XmlJavaTypeAdapter
    这个注解主要是解决一些数据格式化问题的,比如时间格式化。
  • @XmlElementWrapper
    这个注解是加在集合上面的
  • @XmlAttribute
    这个注解会将属性变为上一个结点的属性
  • @XmlType
    类级别的注解,这个注解可以自定义排序,使用propOrder 属性。

搞定收工!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5 C++学习笔记 常用宏的再次理解

1.随意创建一个类&#xff0c;他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. &#xff08;告诉引擎我是从远古大帝UObject中&#xff0c;继承而来&#xff0c;我们是一家人&#xff0c;只是我进化了其他功能…

【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录 一、sort 1.1sort简介 语法 参数 功能 适用容器 1.2sort的用法 1.3自定义比较函数 示例 1265蓝桥题 —— 排序 二、min和max函数 三、min_element和max_element 497蓝桥题 —— 成绩分析 四、nth_element 一、sort 1.1sort简介 sort函数包含在头文件<a…

如何在WordPress中使用 AI 进行 SEO(12 个工具)

您想在 WordPress 中使用 AI 进行 SEO 吗&#xff1f; 人工智能正在对 SEO 行业产生重大影响。已经有优秀的人工智能 SEO 工具&#xff0c;您可以使用它们来提高您的 SEO 排名&#xff0c;而无需付出太多努力。 在本文中&#xff0c;我们将向您展示如何通过我们精心挑选的工具…

Qt 开发环境配置 vs和Qt creator

Qt 开发环境配置 vs和Qt creator 1、安装的软件 1、vs_Enterprise.exe 2、Qt creator (最好是最新的版本,低版本不支持vs2019) 下载地址&#xff1a;https://gofile-3535697530.cn1.quickconnect.cn/sharing/zMCh5ENgZ 密码&#xff1a;qt_dev 2、Qt Creator配置 1、打开…

检索增强生成中的创新

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Innovations In Retrieval Augmented Generation 原文地址:https://medium.com/emalpha/innov…

springsecurity集成kaptcha功能

前端代码 本次采用简单的html静态页面作为演示&#xff0c;也可结合vue前后端分离开发&#xff0c;复制就可运行测试 项目目录 登录界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…

x-cmd pkg | speedtest-cli - 网络速度测试工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 speedtest-cli 是一个网络速度测试工具&#xff0c;用于测试计算机或服务器与速度测试服务器之间的网络连接速度。 它使用 speedtest.net 测试互联网带宽&#xff0c;可以帮助用户获取网络的上传和下载速度、延迟等参…

Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

stm32内存分配博客笔记

原文&#xff1a; stm32内存分配 笔记&#xff1a; 1、向量表与代码段&#xff1b;根据Cortex-M3权威指南描述&#xff0c;系统复位后&#xff0c;在向量表异常0处保存的是堆栈起始地址&#xff0c;而后紧跟中断向量表 2、可以从链接脚本.ld文件中看到终端向量表第一个被链接…

品牌百度百科词条怎么写?

在互联网时代&#xff0c;品牌的影响力愈发重要&#xff0c;而百度百科作为我国最大的百科全书&#xff0c;更是塑造品牌形象、传播品牌价值的重要平台。如何撰写一篇高质量的百度百科品牌词条&#xff0c;成为了众多企业和品牌关注的焦点。品牌百度百科词条怎么写&#xff1f;…

QGraphicsView前有QWidget遮罩,导致QGraphicsItem鼠标事件不响应

场景&#xff1a;在一个QWidget上放置了一个QGraphicsView用于显示图像&#xff0c;QGraphicsView设置了场景&#xff0c;并添加了一个自定义QGraphicsItem。由于需求原因&#xff0c;又绘制了一个标尺QWidget放在QGraphicsView前部。 结果导致标尺QWidget显示时&#xff0c;重…

系统IO

OS&#xff1a;操作系统 管理和分配硬件资源的系统软件&#xff0c;现代操作系统必须提供并发功能 介于应用与硬件之间的 在linux下做应用开发&#xff0c;其实就是调用操作系统提供的API函数的接口操作硬件 一、文件IO是什么&#xff1f; 文件IO分为系统IO和标…

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

WSL2 git clone命令无法克隆远程仓库

问题描述 最近在往WSL2里拉取git仓库的时候&#xff0c;突然出现了这个问题&#xff0c;WSL2无法连接到git服务器&#xff0c;导致代码无法拉取下来&#xff0c;可能是因为我最近不小心修改了windows的防火墙设置&#xff0c;导致出现了这个问题。 解决办法 在查阅了很多篇…

浅析智能家居企业面临的组网问题及解决方案

在这个快速发展的时代&#xff0c;组网对于企业的发展来说是一个至关重要的环节。 案例背景&#xff1a; 案例企业是一家智能家居制造企业&#xff0c;在不同城市分布有分公司、店铺、工厂&#xff0c;这些点原本都是各自采购网络&#xff0c;与总部进行日常沟通、访问。 现在…

<C++>STL->list

list的介绍 list list是一个类模板&#xff0c;第一个模板参数为存储数据类型&#xff1b;第二个模板参数为空间适配器list是一个可以在常数时间内完成任意位置的插入和删除的顺序容器。list容器是以双链表的形式实现的&#xff1b;双链表可以将其包含的每个元素存储在不同且…

性能进阶:使用JMeter进行websocket测试【建议收藏】

本次测试案例主要是分享如何使用JMeter进行websocket协议下的聊天接口性能测试。 包含websocket插件的下载安装、线程组及sampler的设置、csv参数化和组建分布式测试的方法、如何通过调整参数来获得发压机的最大并发数以及对测试过程的总结。 整篇文章只侧重介绍进行websocke…

西圣H1头戴式耳机,百元性能小钢炮,舒适音质性能绝不妥协

近日&#xff0c;深耕智能声学领域多年的 xisem西圣品牌‏‏发布——‏西圣H1头戴式主动降噪蓝牙耳机正式迎来首销。从各个方面来看&#xff0c;这款头戴式耳机展现出了极具颠覆性的创新&#xff0c;不仅在音质和降噪性能上表现出色&#xff0c;更重要的是采用了更加轻巧的佩戴…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

顺时针打印矩阵:偏移量法与边界控制法比较---剑指offer-JZ29 顺时针打印矩阵

在编程中&#xff0c;处理二维数组的问题可以有多种解法。今天&#xff0c;我们将探讨两种解决“顺时针打印矩阵”问题的方法&#xff1a;偏移量法和边界控制法&#xff0c;并进行比较。 题目 题目连接&#xff1a;顺时针打印矩阵_牛客题霸_牛客网 (nowcoder.com) 偏移量法 偏…