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 ...
随机推荐
- std::aligned_alloc
定义于头文件 <cstdlib> (c++) void * aligned_alloc ( std::size_t alignment, std::size_t size); (c++17 ...
- 闺蜜机 StanbyME 产品随想
今天媳妇告诉我,现在小度这边推出一款叫 "闺蜜机"的可用移动的IPAD设备,我点开链接一看,就感觉兴趣不大,不就是一款把屏幕做的更大些的IPAD了吗? 有哪些更多创新呢?为什么会需 ...
- Spring 中的 Bean
前言 欢迎来到本篇文章,鸽了好久了,今天继续写下 Spring 的内容:Spring 中 Bean 的基本概念.基本写法和 3 种实例化 Bean 的方式等. 什么是 Bean? 我们回顾下,什么是 ...
- PyTorch与机器学习中的随机化:减少噪声和随机性
目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例与代码实现讲 ...
- Uniapp下GoEasy通知栏推送不工作问题排查记录
我们是uniapp开发的app,项目中的系统消息推送使用的是GoEasy Websocket 实时推送,上线一段时间后,客户反馈说,当app没有在前台运行时也需要想办法通知用户一些重要的系统通知.那么 ...
- 深度解读AIGC存储解决方案
5月26日,2023数据基础设施技术峰会在苏州举办,腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用,通过对AIGC业务流程和场景的提炼,从内容生成.内容审核和内容 ...
- Unity中的PostProcessScene:深入解析与实用案例
Unity中的PostProcessScene:深入解析与实用案例 在Unity游戏开发中,我们经常需要对场景进行后处理,以实现更丰富的视觉效果.Unity提供了一个名为PostProcessScen ...
- 无需学习Python,一个公式搞定领导想看的大屏
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 不要让"做不了"成为数字化转型的障碍 随着 ...
- 使用clip-path将 GIF 绘制成跳动的字母
前言 之前看到过一个有趣的CSS效果,今天我们也来实现一遍,将动图GIF通过clip-path绘制成一个个跳动的字母. 效果如下: GIF随便找的,嗯?这不是重点,重点是下面的实现过程,别被GIF吸引 ...
- FAQ:Linux 查看服务器型号(R730为例)
命令:dmidecode -t system | grep -e Manufacturer -e Product 查询结果: Manufacturer: Dell Inc. Product Name: ...