当前位置: 首页 > 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;…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...