Springboot支持XML格式报文的传输

springboot,支持,xml,格式,报文,传输 · 浏览次数 : 184

小编点评

The provided code showcases how to convert JSON data to XML format and vice versa using Jackson Data Format annotations and XML libraries in Java. **Key Points:** * **Jackson Dependencies:** * `jackson-dataformat-xml` for handling XML format * `jackson-boot-starter-web` and `jackson-boot-starter-undertow` for web server support * `jackson-boot-starter-tomcat` for embedded server support * **Request Object Model:** * `JsonToXMLChangeReq` class handles the JSON input and converts it to an XML object. * **Response Object Model:** * `JsonToXMLChangeResp` class represents the XML response and maps JSON data to it. * **Serialization Process:** * `javaBeanToXml()` method converts an object to an XML string. * `deseralize()` method loads an XML string into an object of specified type. * `serialize()` method generates a JSON string from an object. **Additional Notes:** * The code assumes the presence of `requestCommon` object within the `requestObj` and `activityId` within the `jsonObject`. * The `XML_HEAD` constant contains the XML header with the root element name. * Jackson 2.15 is used due to an issue with the `jackson-dataformat-xml` version. * The code focuses on generating and consuming XML data; it doesn't demonstrate the complete processing flow. **Overall, the code demonstrates a complete JSON to XML and XML to JSON conversion using Jackson Data Format annotations and XML libraries.**

正文

导入依赖-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;

    }

效果

image

结束!!!遇到一个坑就是jackson-dataformat-xml的版本不能选太高,选2.15的有问题,退到2.14就ok

与Springboot支持XML格式报文的传输相似的内容:

Springboot支持XML格式报文的传输

导入依赖-jackson-dataformat-xml org.springframework.boot spring-boot-starter-web <

Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持(GO PYTHON RUST) 超⼤规模微服务实践 ⾼性能通信(Tripl

SpringBoot项目从0到1配置logback日志打印

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 一、写文背景 我们在写后端项目的时候,日志打印是必需的。支持SpringBoot项目的日志框架一般有log4j、logback,这二者各

IDEA社区版(IDEA Community Edition)创建Springboot父子项目

1. 因为社区办不支持使用spring Spring Initializr 的方式创建项目, 但是我们可以考虑使用别的方式达到效果: 创建方式有3种: 第一种:使用https://start.spring.io/ 官方URL创建项目,再导入到 IDEA Community Edition(后面简称:

springboot使controller异步调用

调用controller方法,遇到操作时间很长的情况下,不希望前端一直等待操作,而希望前端立马接收到操作启动的反馈,而真正的操作在后端执行,需要用到异步调用的方法。实现步骤如下: 一、配置异步支持: 首先,在应用程序的主类上添加 @EnableAsync 注解,以启用异步支持 import org.

[转帖]SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道!

2022-02-27 分类:Java 阅读(1872) 评论(0) GitHub 24k Star 的Java工程师成神之路,不来了解一下吗! 最近,有很多人再传说 SpringBoot要出3.0的版本了,并且宣布不再支持 Java 8,最低要求是 Java 17了。 其实,早在2021年9月份,关

windows下使用dockerdesktop进行部署

Docker部署springboot项目 环境准备 要在windows上使用docker需要确认系统的需求 需要启用虚拟化支持的CPU 启用适用于windows的Linux子系统功能 保证足够的内存 下载dockerdesktop 下载后会提示安装对应的环境 坑点 安装过程中需要安装wsl环境,会遇

网易面试:SpringBoot如何开启虚拟线程?

虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LT

一文读懂Apollo客户端配置加载流程

SpringBoot集成Apollo源码分析 本文基于 apollo-client 2.1.0 版本源码进行分析 Apollo 是携程开源的配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-

手把手带你开发starter,点对点带你讲解原理

在2012 年 10 月,一个叫 Mike Youngstrom 的人在 Spring Jira 中创建了一个功能请求,要求在 Spring Framework 中支持无容器 Web 应用程序体系结构,提出了在主容器引导 Spring 容器内配置 Web 容器服务;这件事情对 SpringBoot 的诞生应该说是起到了一定的推动作用。 所以SpringBoot 设计的目标就是简化繁琐配置,快速建