springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理
背景
最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用XML的请求方式。
思路
一般来说,基于springboot的项目采用的都是JSON格式的请求参数和响应参数,因此需要做一个转换。
从格式上,XML格式的数据,是一个XML头后面是各种标签存放数据。例如data标签代表数据,orderno标签代表订单编号字段。
<?xml version="1.0" encoding="utf-8"?>
<data><orderno>123456789</orderno><ordertype>2</ordertype><ticketno>666555</ticketno>
</data>
手动拼接
这是最容易想到的方式,因为格式相对固定,字段不多的请求下直接手动拼接就好了。
jackson框架
jackson-dataformat-xml框架提供了bean转xml和xml转bean的能力,并且使用简单,省去了繁琐的拼接操作。
springboot集成jackson-dataformat-xml
1.引入依赖
需要注意,如果项目已经引入过jackson依赖,在引入jackson-dataformat-xml依赖的时候需要保持依赖版本一致,可以通过在依赖管理搜jackson来查看版本。如果版本一致还是报错,考虑使用更高版本。
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.11.3</version></dependency>
2.添加注解
如下:(设置标签名都是设置localName字段)
@JacksonXmlRootElement注解用来生成参数外一层的标签,也就是data标签,只有当对象是根对象的时候才生效,也就是最外层对象,如果作为某个对象的属性,则不生效。
@JacksonXmlProperty注解用来生成具体参数的标签,如payorderno字段,会根据注解配置生成ticketno标签,如果标签名和字段名一致可省略。如下,orderno、ordertype都因为字段名和标签名一致可省略该注解。
注意:如果标签名首字母是大写的,在定义字段的时候就必须用@JacksonXmlProperty注解指定。
如果内部是其他对象的引用,也把它当成一个字段即可,通过加@JacksonXmlProperty注解来设置对象引用的标签名。
如果内部是一个list,则需要加@JacksonXmlElementWrapper注解,来设置list标签的名称。@JacksonXmlProperty来设置list内部对象的标签。
//内部对象,本例子中insideData不生效
@Data
@JacksonXmlRootElement(localName = "insideData")
public class InsideBO {private String level;
}//list存的对象,listData也不生效
@Data
@JacksonXmlRootElement(localName = "listData")
public class ListBO {private String name;private Integer age;
}import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import java.util.List;
@Data
@JacksonXmlRootElement(localName = "data")
public class TestBO {private String orderno;private Integer ordertype;@JacksonXmlProperty(localName = "ticketno")private String payorderno;/*** 指定该对象引用的标签为testInsideBO3,把它也当成普通字段即可*/private InsideBO testInsideBO1;@JacksonXmlProperty(localName = "testInsideBO3")private InsideBO testInsideBO2;/*** 不指定list和内部对象的标签,默认都使用字段名*/private List<ListBO> listBOS1;/*** 指定list的标签为listBOS3,内部对象的标签为listdetail*/@JacksonXmlElementWrapper(localName = "listBOS3")@JacksonXmlProperty(localName = "listdetail")private List<ListBO> listBOS2;}
3.转换
bean转xml
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
public class Test {@org.junit.jupiter.api.Testpublic void test(){TestBO testBO=new TestBO();testBO.setOrderno("123456789");testBO.setOrdertype(2);testBO.setPayorderno("666555");List<ListBO> list=new ArrayList<>();ListBO listBO=new ListBO();listBO.setName("list");listBO.setAge(18);list.add(listBO);testBO.setListBOS1(list);testBO.setListBOS2(list);InsideBO insideBO=new InsideBO();insideBO.setLevel("100");testBO.setTestInsideBO1(insideBO);testBO.setTestInsideBO2(insideBO);XmlMapper xmlMapper=new XmlMapper();String s1 = null;try {s1 = xmlMapper.writeValueAsString(testBO);} catch (JsonProcessingException e) {e.printStackTrace();}System.out.println(s1);}
}
打印结果如下:
<data>
<orderno>123456789</orderno>
<ordertype>2</ordertype>
<ticketno>666555</ticketno>
<testInsideBO1><level>100</level>
</testInsideBO1>
<testInsideBO3><level>100</level>
</testInsideBO3>
<listBOS1><listBOS1><name>list</name><age>18</age></listBOS1>
</listBOS1><listBOS3><listdetail><name>list</name><age>18</age>/listdetail>
</listBOS3>
</data>
只需要再拼接一个xml的头就可以用来发请求了。
xml转bean
以上面转换得到的xml结果作为本次转换的入参。加上xml头更符合响应的xml
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
public class Test {@org.junit.jupiter.api.Testpublic void test(){TestBO testBO=new TestBO();testBO.setOrderno("123456789");testBO.setOrdertype(2);testBO.setPayorderno("666555");List<ListBO> list=new ArrayList<>();ListBO listBO=new ListBO();listBO.setName("list");listBO.setAge(18);list.add(listBO);testBO.setListBOS1(list);testBO.setListBOS2(list);InsideBO insideBO=new InsideBO();insideBO.setLevel("100");testBO.setTestInsideBO1(insideBO);testBO.setTestInsideBO2(insideBO);XmlMapper xmlMapper=new XmlMapper();String s1 = null;try {s1 = xmlMapper.writeValueAsString(testBO);} catch (JsonProcessingException e) {e.printStackTrace();}System.out.println(s1);s1="<?xml version=\"1.0\" encoding=\"gb2312\"?>"+s1;System.out.println(s1);TestBO testBO1 = null;try {testBO1 = xmlMapper.readValue(s1, TestBO.class);} catch (JsonProcessingException e) {e.printStackTrace();}System.out.println(testBO1);}
}
打印结果如下:
成功将xml参数转换成bean.
TestBO(orderno=123456789,ordertype=2, payorderno=666555,testInsideBO1=InsideBO(level=100),testInsideBO2=InsideBO(level=100),listBOS1=[ListBO(name=list, age=18)],listBOS2=[ListBO(name=list, age=18)])
相关文章:
springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理
背景 最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用XML的请求方式。 思路 一般来说,基于springboot的项目采用的都是JSON格式的请求参数和响应参数,因此需要做一个转…...
Spring Cloud Gateway 网关的使用
在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…...
超高速工业相机的应用
超高速工业相机一般安装在机器流水线上代替人眼来做测量和判断,通过数字图像摄取目标转换成图像信号,传送给专用的图像处理系统。图像处理系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。一般来说&…...
学习笔记--电磁兼容性EMC
一、基本概念 电磁兼容性(Electromagnetic Compatibility,EMC)是电子电气设备在特定电磁环境中正常工作的能力,同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰,又能避…...
利用开源小智AI制作桌宠机器狗
本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...
基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】
一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域,多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系,但其性能高度依赖超参数的选择,例如隐含层神经元数量、学习率、迭代次数等。…...
Qt中C++与QML交互从原理、方法与实践陷阱深度解析
在我们使用Qt开发中,现在以及普遍通过 C 与 QML 的交互,将 C 的强大功能与 QML 的界面设计优势相结合,既保证了应用程序的性能和稳定性,又能快速实现美观、易用的用户界面。接下来专门讲下C与QML交互原理、方法与实践中的一些陷阱…...
基于SpringBoot和Leaflet的邻省GDP可视化实战
目录 前言 一、技术实现路径 1、空间数据检索 2、数据展示检索流程 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS前端实现 1、控制面展示 2、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天,数据已成为驱动社会经济发展、指导政策…...
esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法
最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...
Grouped-Query Attention(GQA)详解: Pytorch实现
Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…...
DeepSeek AI人工智能该如何学习?
人工智能(Artificial Intelligence, AI)是当今科技领域的热门话题,它涵盖了机器学习、深度学习、自然语言处理、计算机视觉等多个子领域。 作为中国科技发展的核心方向之一,AI在国家战略规划中占据了重要地位,特别是在…...
【数据库】【MySQL】索引
MySQL中索引的概念 索引(MySQL中也叫做"键(key)")是一种数据结构,用于存储引擎快速定找到记录。 简单来说,它类似于书籍的目录,通过索引可以快速找到对应的数据行,而无需…...
SprinBoot整合HTTP API:从零开始的实战指南
在现代 Web 开发中,HTTP API 是前后端交互的核心。Spring Boot 作为 Java 生态中备受欢迎的框架,提供了简洁而强大的方式来构建和整合 HTTP API。本文将带你从零开始,通过具体代码示例,展示如何在 Spring Boot 中整合 HTTP API,实现高效、稳定的前后端通信。 一、为什么选…...
可狱可囚的爬虫系列课程 13:Requests使用代理IP
一、什么是代理 IP 代理 IP(Proxy IP)是一个充当“中间人”的服务器IP地址,用于代替用户设备(如电脑、手机等)直接与目标网站或服务通信。用户通过代理IP访问互联网时,目标网站看到的是代理服务器的IP地址&…...
DBeaver下载安装及数据库连接(MySQL)
1. DBeaver下载 官网下载地址:Download | DBeaver Community 2. 安装 1. 双击下载的安装包,选择简体中文。 2. 点击下一步。 3. 点击我接受。 4. 如下勾选为所有用户安装,点击下一步。 5. 需重复做1~3 的步骤。 6. 选择组件,默认即可&…...
国产开源PDF解析工具MinerU
前言 PDF的数据解析是一件较困难的事情,几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的,PostScript是一门图灵完备的语言。而WORD需要的渲染,本质上是PDF能力的子集。大模型领域,我们的目标文件格…...
消息中间件的开源实现
根据你的需求,以下是一些可以实现类似阿里巴巴 MetaQ 功能的消息中间件和相关项目,这些项目可以帮助你实现消息的动态配置和管理: 1. RocketMQ RocketMQ 是一个分布式消息中间件,支持高吞吐量、低延迟的消息传递,适合…...
AcWing 299 裁剪序列
这道题算是我做过所有的单调队列优化 d p dp dp 题目中最难想的一道题,所以写篇题解再捋捋思路。 暴力 首先很容易想到设 d p i dp_i dpi 表示将前 i i i 个数划分成若干序列,【每个序列的最大值之和】的最小值。 那么就会有: d p i …...
P2889 [USACO07NOV] Milking Time S
题目大意 有 N N N 个小时可以挤奶。其中有 m m m 个时间段可以给 Bessis 奶牛挤奶。第 i i i 个时间段为 s i s_i si ~ t i t_i ti,可以获得 E f f i Eff_i Effi 滴奶。每次挤完奶后,人都要休息 R R R 小时。最后问,一共能挤出…...
基于Spring Boot的健康医院门诊在线挂号系统设与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
