当前位置: 首页 > 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.添加注解

如下:
@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.转换

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的头就可以用来发请求了。
打印的第三行参数和实际请求收到的响应结果也差不多。

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)

相关文章:

  • docker离线安装记录
  • 人工智能基础知识笔记一:核函数
  • 使用 BFS 解决 最短路问题
  • springboot005学生心理咨询评估系统(源码+数据库+文档)
  • Xinference和ollama有什么区别
  • 【CSS】HTML元素布局基础总结
  • 沁恒CH32V307RCT6烧写hex文件时报错“设置芯片型号失败”
  • IP---网络类型
  • 基于 MySQL 递归 CTE 实现表,父级id与子级id拼接
  • 零信任应用侧理性选择并期许未来
  • 捷 C++ 课程学习笔记:STL 应用与复杂度分析
  • 【react】基础教程
  • 【Linux-网络】从逻辑寻址到物理传输:解构IP协议与ARP协议的跨层协作
  • 求解动态完全未知的连续时间非线性系统的优化控制的全局自适应动态规划算法
  • KubeSphere平台安装
  • 面试八股文--数据库基础知识总结(1)
  • 应无所住而生其心:心灵的自在与解脱
  • 深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分
  • 中国的Cursor! 字节跳动推出Trae,开放Windows版(附资源),开发自己的网站,内置 GPT-4o 强大Al模型!
  • Flutter使用permission_handler请求通知权限不会弹出权限弹窗
  • 企业网站怎么做推广/品牌营销理论有哪些
  • 从学习php到可以独立做网站需要多久/汕头百度推广公司
  • 什么叫企业网站/seo报价单
  • 电子商务网站建设报价表/百度指数如何提升
  • 做视频直播类型的网站/查看浏览过的历史记录百度
  • wordpress主题几个网站/品牌营销策略分析论文