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 ...
随机推荐
- 【网络知识】FTP主被动模式介绍及抓包分析
一.FTP是什么 FTP,即文件传输协议(File Transfer Protocol,FTP),基于该协议客户端与服务端可以实现共享文件.上传文件.下载文件. FTP 基于TCP协议生成两个连接,一 ...
- Ubuntu 16.04关闭系统自动更新
# 背景在使用阿里云ECS服务器时,服务器CPU与内存突然增大,经过排查发现是系统自动更新导致,幸运的是不是发生在业务高峰期,为了避免出现类似的情况,决定禁用系统自动更新,可以通过手动或者定时任务的方 ...
- GPT3:人工智能时代的新型语言模型
目录 GPT-3:人工智能时代的新型语言模型 随着人工智能技术的不断发展,自然语言处理领域也迎来了新的里程碑.GPT-3 是当前最具代表性的语言模型之一,它具有如下特点: GPT-3 是一种全新的语言 ...
- 使用TensorFlow进行自动化测试与部署
目录 标题:<使用 TensorFlow 进行自动化测试与部署> 背景介绍: 随着人工智能和机器学习技术的快速发展,TensorFlow 成为了一个广泛应用的深度学习框架,被广泛用于构建神 ...
- GGTalk 开源即时通讯系统源码剖析之:数据库设计
自从<开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS.银河麒麟上运行!>一文在博客园发布后,有园友联系我QQ,说能不能整理个更系统更详细地介绍GGTalk源码 ...
- uniapp学习(一)
[新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握] https://www.bilibili.com/video/BV1mT411K7nW/?p=24&sh ...
- 调用内部或私有方法的N种方法
非公开的类型或者方法被"隐藏"在程序集内部,本就不希望从外部访问,但是有时候调用一个内部或者私有方法可能是唯一的"救命稻草",这篇文章列出了几种具体的实现方式. ...
- Hexo博客Next主题友链页面
博客友链太多,需要自定义一个友情链接页面 link渲染文件 在 hexo/themes/next/layout 目录下建一个 link.swig文件,写入以下代码 {% block content % ...
- 安装centos系统,硬盘检测报错:修改BIOS为 Legacy
进bios,将模式修改为legacy. 硬盘使用 MBR 分区,需要用 Legacy BIOS 启动,而不是 UEFI BIOS . 至于为什么安装的时候会报错? 可能是系统有这方面限制.也可能是别的 ...
- Vue笔记(一)
1. Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高 ...