springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理

news/2025/2/25 5:47:34
xmlns="http://www.w3.org/2000/svg" style="display: none;">

背景

最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用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转xmlxml转bean的能力,并且使用简单,省去了繁琐的拼接操作。

xml_20">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.添加注解

如下:
@JacksonXmlRootElement注解用来生成参数外一层的标签,也就是data标签。
@JacksonXmlProperty注解用来生成具体参数的标签,如payorderno字段,会根据注解配置生成ticketno标签,如果标签名和字段名一致可省略。如下,orderno和ordertype因为字段名和标签名一致就可省略该注解。

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
@Data
@JacksonXmlRootElement(localName = "data")
public class TestBO {

	private String orderno;

	private Integer ordertype;
	
	@JacksonXmlProperty(localName = "ticketno")
	private String payorderno;
}

假如现在有一个对象:

{
"orderno":"123456789",
"ordertype":2,
"payorderno":"666555"
}

转换之后得到的xml字符串:

<data>
<orderno>123456789</orderno>
<ordertype>2</ordertype>
<ticketno>666555</ticketno>
</data>

3.转换

xml_72">bean转xml

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.jeecg.modules.admin.invoice.bo.TestBO;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class Test {
	@org.junit.Test
	public void test(){
		TestBO testBO=new TestBO();
		testBO.setOrderno("123456789");
		testBO.setOrdertype(2);
		testBO.setPayorderno("666555");
		String s = JSONObject.toJSONString(testBO);
		System.out.println(s);
		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);
	}
}

打印结果如下:

{"orderno":"123456789","ordertype":2,"payorderno":"666555"}
<data><orderno>123456789</orderno><ordertype>2</ordertype><ticketno>666555</ticketno></data>
<?xml version="1.0" encoding="gb2312"?><data><orderno>123456789</orderno><ordertype>2</ordertype><ticketno>666555</ticketno></data>

只需要再拼接一个xml的头就可以用来发请求了。
打印的第三行参数和实际请求收到的响应结果也差不多。

xmlbean_114">xml转bean

以上面转换得到的xml结果作为本次转换的入参。

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.jeecg.modules.admin.invoice.bo.TestBO;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class Test {
	@org.junit.Test
	public void test(){
		TestBO testBO=new TestBO();
		testBO.setOrderno("123456789");
		testBO.setOrdertype(2);
		testBO.setPayorderno("666555");
		String s = JSONObject.toJSONString(testBO);
		System.out.println(s);
		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.

{"orderno":"123456789","ordertype":2,"payorderno":"666555"}
<data><orderno>123456789</orderno><ordertype>2</ordertype><ticketno>666555</ticketno></data>
<?xml version="1.0" encoding="gb2312"?><data><orderno>123456789</orderno><ordertype>2</ordertype><ticketno>666555</ticketno></data>
LoginBO(orderno=123456789, ordertype=2, payorderno=666555)

http://www.niftyadmin.cn/n/5865045.html

相关文章

基金基础知识

一、基金的本质与价值 定义&#xff1a; 基金是通过集合投资者资金&#xff0c;由专业管理人&#xff08;基金经理&#xff09;进行多元化投资&#xff08;如股票、债券等&#xff09;的金融工具&#xff0c;收益按持有份额分配。 核心优势&#xff1a; 分散风险&#xff1a;…

AI写代码工具赋能前端开发:高效学习与应用AI前端框架

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着软件开发的模式。在前端开发领域&#xff0c;AI写代码工具的兴起更是掀起了一场革命&#xff0c;为开发者带来了前所未有的效率提升和全新的开发体验。掌握AI前端框架已不再是锦上添花&#xff0c;而是提升竞争…

《Effective Objective-C》阅读笔记(下)

目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …

第5章 软件工程(二)

5.3 软件设计 需求阶段解决“做什么”的问题&#xff0c;而软件设计阶段解决“怎么做”的问题。软件设计分为结构化设计与面向对象设计。 5.3.1 结构化设计 结构化设计(SD)是一种面向数据流的方法&#xff0c;其目的在于确定软件结构。它以SRS和SA阶段所产生的DFD和数据字典…

Gin从入门到精通(八)身份验证与授权(JWT)

身份验证与授权(JWT) Gin 支持通过 JWT&#xff08;JSON Web Token&#xff09;来实现用户的身份验证。通过中间件验证用户的身份后&#xff0c;可以控制资源的访问权限。 JWT 认证流程 : 1. 用户登录 → 服务端验证 → 生成 JWT → 返回 Token 2. 客户端存储 Token → 后…

大模型架构与训练方向

一、核心知识领域 ‌模型架构设计‌ 掌握Transformer、MoE&#xff08;Mixture-of-Experts&#xff09;、RetNet等主流架构的原理与实现细节&#xff0c;需深入理解注意力机制、位置编码、稀疏激活等技术‌13。学习多模态融合架构&#xff08;如CLIP、Flamingo&#xff09;&…

Unity3D实现编辑器截屏Preview窗口,并生成图片PNG

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、Preview窗口👉二、手动选择预制体截屏👉二、自动选择预制体截屏👉壁纸分享👉总结👉前言 想要在Unity编辑器中截取Preview窗口的截图,并生成图片的代码。 有时候可能会需要此模型的图片,又不想P图,…

AI(14)-prompt

1.BaseLLM 和Tuned LLM之间的区别 基本模型 指令微调模型 人类反强化学习 2.指南 下载包 导入包设置key 2个基本原则 写明确特定的指令 给模型时间思考 2.1.使用分割符清楚地指示输入的不同部分 示例&#xff1a;对这个段落进行总结&#xff0c;将用3个单引号…