当前位置: 首页 > news >正文

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响应参数处理

背景 最近在做发票相关的业务&#xff0c;需要对接第三方进行开发票等一系列操作&#xff0c;对方的系统是较老系统&#xff0c;需要采用XML的请求方式。 思路 一般来说&#xff0c;基于springboot的项目采用的都是JSON格式的请求参数和响应参数&#xff0c;因此需要做一个转…...

Spring Cloud Gateway 网关的使用

在之前的学习中&#xff0c;所有的微服务接口都是对外开放的&#xff0c;这就意味着用户可以直接访问&#xff0c;为了保证对外服务的安全性&#xff0c;服务端实现的微服务接口都带有一定的权限校验机制&#xff0c;但是由于使用了微服务&#xff0c;就需要每一个服务都进行一…...

超高速工业相机的应用

超高速工业相机一般安装在机器流水线上代替人眼来做测量和判断&#xff0c;通过数字图像摄取目标转换成图像信号&#xff0c;传送给专用的图像处理系统。图像处理系统对这些信号进行各种运算来抽取目标的特征&#xff0c;进而根据判别的结果来控制现场的设备动作。一般来说&…...

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;是电子电气设备在特定电磁环境中正常工作的能力&#xff0c;同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰&#xff0c;又能避…...

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...

基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】

一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域&#xff0c;多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系&#xff0c;但其性能高度依赖超参数的选择&#xff0c;例如隐含层神经元数量、学习率、迭代次数等。…...

Qt中C++与QML交互从原理、方法与实践陷阱深度解析

在我们使用Qt开发中&#xff0c;现在以及普遍通过 C 与 QML 的交互&#xff0c;将 C 的强大功能与 QML 的界面设计优势相结合&#xff0c;既保证了应用程序的性能和稳定性&#xff0c;又能快速实现美观、易用的用户界面。接下来专门讲下C与QML交互原理、方法与实践中的一些陷阱…...

基于SpringBoot和Leaflet的邻省GDP可视化实战

目录 前言 一、技术实现路径 1、空间数据检索 2、数据展示检索流程 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS前端实现 1、控制面展示 2、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天&#xff0c;数据已成为驱动社会经济发展、指导政策…...

esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法

最近上手了正点原子esp32s3板子&#xff0c;环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试&#xff0c;每次都报这个错误无法建造。也不是网上说的ninja error&#xff0c;不是中文路径的问题。 在终端中查看&#xff0c;发现是缺少了git。&#xff08;我这里没有…...

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention&#xff08;GQA&#xff09;详解 Grouped-Query Attention&#xff08;GQA&#xff09; 是 Multi-Query Attention&#xff08;MQA&#xff09; 的改进版&#xff0c;它通过在 多个查询头&#xff08;Query Heads&#xff09;之间共享 Key 和 Value&am…...

DeepSeek AI人工智能该如何学习?

人工智能&#xff08;Artificial Intelligence, AI&#xff09;是当今科技领域的热门话题&#xff0c;它涵盖了机器学习、深度学习、自然语言处理、计算机视觉等多个子领域。 作为中国科技发展的核心方向之一&#xff0c;AI在国家战略规划中占据了重要地位&#xff0c;特别是在…...

【数据库】【MySQL】索引

MySQL中索引的概念 索引&#xff08;MySQL中也叫做"键&#xff08;key&#xff09;"&#xff09;是一种数据结构&#xff0c;用于存储引擎快速定找到记录。 简单来说&#xff0c;它类似于书籍的目录&#xff0c;通过索引可以快速找到对应的数据行&#xff0c;而无需…...

SprinBoot整合HTTP API:从零开始的实战指南

在现代 Web 开发中,HTTP API 是前后端交互的核心。Spring Boot 作为 Java 生态中备受欢迎的框架,提供了简洁而强大的方式来构建和整合 HTTP API。本文将带你从零开始,通过具体代码示例,展示如何在 Spring Boot 中整合 HTTP API,实现高效、稳定的前后端通信。 一、为什么选…...

可狱可囚的爬虫系列课程 13:Requests使用代理IP

一、什么是代理 IP 代理 IP&#xff08;Proxy IP&#xff09;是一个充当“中间人”的服务器IP地址&#xff0c;用于代替用户设备&#xff08;如电脑、手机等&#xff09;直接与目标网站或服务通信。用户通过代理IP访问互联网时&#xff0c;目标网站看到的是代理服务器的IP地址&…...

DBeaver下载安装及数据库连接(MySQL)

1. DBeaver下载 官网下载地址:Download | DBeaver Community 2. 安装 1. 双击下载的安装包&#xff0c;选择简体中文。 2. 点击下一步。 3. 点击我接受。 4. 如下勾选为所有用户安装&#xff0c;点击下一步。 5. 需重复做1~3 的步骤。 6. 选择组件&#xff0c;默认即可&…...

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…...

消息中间件的开源实现

根据你的需求&#xff0c;以下是一些可以实现类似阿里巴巴 MetaQ 功能的消息中间件和相关项目&#xff0c;这些项目可以帮助你实现消息的动态配置和管理&#xff1a; 1. RocketMQ RocketMQ 是一个分布式消息中间件&#xff0c;支持高吞吐量、低延迟的消息传递&#xff0c;适合…...

AcWing 299 裁剪序列

这道题算是我做过所有的单调队列优化 d p dp dp 题目中最难想的一道题&#xff0c;所以写篇题解再捋捋思路。 暴力 首先很容易想到设 d p i dp_i dpi​ 表示将前 i i i 个数划分成若干序列&#xff0c;【每个序列的最大值之和】的最小值。 那么就会有&#xff1a; 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​&#xff0c;可以获得 E f f i Eff_i Effi​ 滴奶。每次挤完奶后&#xff0c;人都要休息 R R R 小时。最后问&#xff0c;一共能挤出…...

基于Spring Boot的健康医院门诊在线挂号系统设与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...