导入依赖-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格式报文的传输的更多相关文章

  1. xml格式报文的拼装,和解析成实体类

    我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...

  2. SpringBoot支持Xml数据格式显示

    第一步:pom文件添加依赖 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> < ...

  3. 复杂xml格式报文和实体类之间的转化

    pom.xml中引入如下依赖: <dependency> <groupId>org.eclipse.persistence</groupId> <artifa ...

  4. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  5. 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

    背景:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子. 业务逻辑简介:客户端在a表中添加了几条数据,从SQL Server数据库直接取出新添加的数据(D ...

  6. java socket报文通信(三)java对象和xml格式文件的相互转换

    前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...

  7. tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式

     tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式  https://github.com/zhangzheyuk/CaseConvert

  8. 返回报文变成xml格式了!

    首先,google chrome之前有安装jsonview插件: 然后,自己弄springCloud项目,搭建eureka后,访问url发现返回报文变成xml格式了,一通摸索及查找,现整理如下: 1. ...

  9. Asp.Net Core WebAPI中启用XML格式数据支持

    因为XML是一种非常常用的数据格式,所以Asp.Net core提供了非常便利的方式来添加对XML格式的支持 只需要在IOC注册Controller服务的后面跟上.AddXmlDataContract ...

  10. Asp.net Core WebApi 支持json/xml格式的数据返回

    Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...

随机推荐

  1. .Net7矢量化的性能优化

    前言 矢量化是性能优化的重要技术,也是寄托硬件层面的优化技术.本篇来看下. 概括 一:矢量化支持的问题: 矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask ...

  2. xpoc漏洞使用与编写 浅尝

    下载地址 https://github.com/chaitin/xpoc/releases 目前最新版本是 0.0.4 可能是我还是不太习惯yaml这种结构的,感觉就很反人类,所以我以前一般都还是po ...

  3. Hugging News #0616: 有几项非常重要的合作快来围观、最新中文演讲视频回放发布!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  4. 从钢铁行业数字化管控与超自动化融合,看华为WeAutomate能力进化

    文/王吉伟 钢铁行业的数字化转型,历来都是值得探讨的热点话题. 2022年,我国粗钢产量10.13亿吨,占据了全球钢铁供给市场的半壁江山. 这组数据可谓非常抢眼,但仍旧难掩诸多企业的各种经营问题. 钢 ...

  5. 论文日记二:VGG

    1. 导读 前面我们回顾了AlexNet,AlexNet的作者指出模型的深度很重要,而VGG最大的贡献就在于对网络模型深度的研究. VGG原论文:<Very Deep Convolutional ...

  6. TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范

    TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范 本文深入介绍了微软最近发布的 TypeChat 项目,该项目允许开发者定义大语言模型返回的响应结构.通过分析源代码,探讨了 ...

  7. .Net Core 3.0 对 MongoDB 的多条件查询(两种)操作

    前言   在日常开发中,偶尔会用到 MongoDB 的数据操作,也花费了一些时间调试,因此在此处记录一下,共同进步. 废话少说,出招吧! 正文 2.1 准备工作 首先需要引入 .Net 平台链接 Mo ...

  8. RobotFrameWork环境搭建及使用

    RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...

  9. vue结合cesium,配置,插件vue-cli-plugin-cesium

    https://www.npmjs.com/package/vue-cli-plugin-cesium

  10. [kvm]硬盘IO优化

    硬盘类型选择 在CentOS7中有IDE.SATA和virtio三种,建议用virtio三种.virtio是半虚拟化的,性能媲美原生. 缓存模式选择 缓存模式有五种,不过常用的只有三种:writeth ...