Springboot支持XML格式报文的传输
导入依赖-jackson-dataformat-xml
<!--整合web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用Undertow服务器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--支持xml格式报文-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.14.3</version>
</dependency>
示例预设值请求XML格式
<?xml version="1.0" encoding="UTF-8" ?>
<request>
<username>隔壁老郭</username>
<activityId>9090960</activityId>
<timestamp>1684470742</timestamp>
</request>
示例预设值响应XML格式
<resp>
<code>200 Ok</code>
<timestamp>1684500309</timestamp>
<msg>很高兴认识你-白嫖老郭</msg>
<requestCommon>
<body>隔壁老郭</body>
<activityId>9090960</activityId>
</requestCommon>
</resp>
构建请求进来的对象VO
/**
* @description: JSON-XML转化
* @author: GuoTong
* @createTime: 2023-05-19 10:37
* @since JDK 1.8 OR 11
**/
@Data
@JacksonXmlRootElement(localName = "request")
@NoArgsConstructor
@AllArgsConstructor
public class JsonToXMLChangeReq implements Serializable {
// 用户名
@JacksonXmlProperty(localName = "username")
private String username;
// 用户活动ID
@JacksonXmlProperty(localName = "activityId")
private String activityId;
// 时间戳
@JacksonXmlProperty(localName = "timestamp")
private Long timestamp;
}
构建响应出去的对象VO:
注意这个响应体是多层级的XML格式
* @description:
* @author: GuoTong
* @createTime: 2023-05-19 12:00
* @since JDK 1.8 OR 11
**/
@Data
public class RequestCommon implements Serializable {
// 用户活动ID
@JacksonXmlProperty(localName = "body")
private String body;
// 用户活动ID
@JacksonXmlProperty(localName = "activityId")
private String activityId;
}
/**
* @description: JSON-XML转化
* @author: GuoTong
* @createTime: 2023-05-19 10:37
* @since JDK 1.8 OR 11
**/
@Data
@JacksonXmlRootElement(localName = "resp")
@NoArgsConstructor
@AllArgsConstructor
public class JsonToXMLChangeResp implements Serializable {
// 状态码
@JacksonXmlProperty(localName = "code")
private String code;
// 时间戳
@JacksonXmlProperty(localName = "timestamp")
private Long timestamp;
// 响应描述
@JacksonXmlProperty(localName = "msg")
private String msg;
private RequestCommon RequestCommon;
}
/**
* @description:
* @author: GuoTong
* @createTime: 2023-05-19 12:00
* @since JDK 1.8 OR 11
**/
@Data
public class RequestCommon implements Serializable {
// 用户活动ID
@JacksonXmlProperty(localName = "body")
private String body;
// 用户活动ID
@JacksonXmlProperty(localName = "activityId")
private String activityId;
}
编写Controller
@PostMapping(value = "/xml",
consumes = MediaType.APPLICATION_XML_VALUE,
produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public String getCameraImageTest(@RequestBody JsonToXMLChangeReq jsonToXMLChange) {
JsonToXMLChangeResp jsonToXMLChangeResp = new JsonToXMLChangeResp();
jsonToXMLChangeResp.setCode("200");
jsonToXMLChangeResp.setTimestamp(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
jsonToXMLChangeResp.setMsg("很高兴认识你-白嫖老郭");
RequestCommon requestCommon = new RequestCommon();
requestCommon.setActivityId(jsonToXMLChange.getActivityId());
requestCommon.setBody(jsonToXMLChange.getUsername());
jsonToXMLChangeResp.setRequestCommon(requestCommon);
return JSONXMLUtils.serialize(jsonToXMLChangeResp);
}
使用到工具类:XML和对象和String互相转化
/**
* @description: JSON-XML转化
* @author: GuoTong
* @createTime: 2023-05-19 10:50
* @since JDK 1.8 OR 11
**/
@Slf4j
public class JSONXMLUtils {
//XML文件头
private static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
private static XmlMapper xmlMapper = new XmlMapper();
public static String javaBeanToXml(Object obj) {
String xml = null;
if (Objects.isNull(obj)) {
return xml;
}
try {
xml = xmlMapper.writeValueAsString(obj);
} catch (Exception e) {
log.error("javaBeanToXml error, obj={}, xml={}", obj, xml, e);
return xml;
}
// 添加xml文件头
return XML_HEAD + xml;
}
public static <T> T deseralize(String str, Class<T> cls) {
InputStream inputStream = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
T response = null;
try {
response = xmlMapper.readValue(inputStream, cls);
} catch (IOException e) {
log.error("xml反编码出错");
e.printStackTrace();
}
return response;
}
public static <T> String serialize(T requestObj) {
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
String req = null;
try {
req = xmlMapper.writeValueAsString(requestObj);
} catch (JsonProcessingException e) {
log.error("xml编码出错");
}
return req;
}
效果

结束!!!遇到一个坑就是jackson-dataformat-xml的版本不能选太高,选2.15的有问题,退到2.14就ok
Springboot支持XML格式报文的传输的更多相关文章
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- SpringBoot支持Xml数据格式显示
第一步:pom文件添加依赖 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> < ...
- 复杂xml格式报文和实体类之间的转化
pom.xml中引入如下依赖: <dependency> <groupId>org.eclipse.persistence</groupId> <artifa ...
- Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应
在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...
- 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)
背景:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子. 业务逻辑简介:客户端在a表中添加了几条数据,从SQL Server数据库直接取出新添加的数据(D ...
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式
tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式 https://github.com/zhangzheyuk/CaseConvert
- 返回报文变成xml格式了!
首先,google chrome之前有安装jsonview插件: 然后,自己弄springCloud项目,搭建eureka后,访问url发现返回报文变成xml格式了,一通摸索及查找,现整理如下: 1. ...
- Asp.Net Core WebAPI中启用XML格式数据支持
因为XML是一种非常常用的数据格式,所以Asp.Net core提供了非常便利的方式来添加对XML格式的支持 只需要在IOC注册Controller服务的后面跟上.AddXmlDataContract ...
- Asp.net Core WebApi 支持json/xml格式的数据返回
Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...
随机推荐
- 尚医通day09-【用户平台搭建详细步骤】(内附源码)
页面预览 首页 医院详情 第01章-服务器端渲染和客户端渲染 1.搜索引擎优化 1.1.什么是搜索引擎优化 SEO 是网站为了获得更多的流量,对网站的结构及内容进行调整和优化,以便搜索引擎 (百度,g ...
- 【HMS Core】Health Kit注册订阅后,每种设备都会通过相同的回调地址上传数据?
[问题描述1] 注册订阅后,每种设备都会通过相同的回调地址上传数据? [解决方案] 一般和设备关系不大.订阅回调地址只有一个,当用户完成订阅,且用户数据在云端发生变化时,我们会向您提供的订阅地址发送 ...
- React SSR - 写个 Demo 一学就会
React SSR - 写个 Demo 一学就会 今天写个小 Demo 来从头实现一下 react 的 SSR,帮助理解 SSR 是如何实现的,有什么细节. 什么是 SSR SSR 即 Server ...
- 一行命令使用 Docker 编译 Latex 文件,简单优雅
使用 Docker 编译 LaTeX 文章 LaTeX 是一种常用的排版系统,它可以帮助用户创建漂亮.专业的文档.但是,安装和配置 LaTeX 比较麻烦,特别是对于初学者而言. Docker 是一个开 ...
- 跟着 GPT-4 从0到1学习 Golang 并发机制(一)
目录 一.前言 二.开聊 2.1 Golang 里的并发机制介绍 2.2 Goroutine 与线程 2.3 Goroutine 与线程的调度开销 2.4 用户态和内核态 2.5 Golang 并发编 ...
- 安装mysql5.7.20,和遇到的一些错误及解决方案
下载: mysql-5.7.20是解压版免安装的,mysql-5.7.20下载地址:http://dev.mysql.com/downloads/mysql/ 2.安装 解压在你喜欢的位置 3.配置 ...
- quarkus实战之一:准备工作
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<quarkus实战>系列 <q ...
- ranger2.1.0源码编译以及安装
ranger2.1.0源码编译以及安装 编译环境准备 环境需求 示例版本 JDK8 Java(TM) SE Runtime Environment (build 1.8.0_231-b11) mave ...
- Codeforces Round #888 (Div. 3) A-G
比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...
- tensorflow-2.7-M1-安装依赖openblas问题
问题描述 安装过程 conda create -n conda-forge-tensorflow conda-forge::tensorflow conda info -e conda activat ...