首页 > 其他分享 >Springboot支持XML格式报文的传输

Springboot支持XML格式报文的传输

时间:2023-05-19 13:12:58浏览次数:37  
标签:XML xml Springboot 报文 private localName JacksonXmlProperty String

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

标签:XML,xml,Springboot,报文,private,localName,JacksonXmlProperty,String
From: https://www.cnblogs.com/gtnotgod/p/17414808.html

相关文章

  • SpringBoot 配置统一API对象返回
    1、前言在实际项目开发中,为了便于前端进行响应处理,需要统一返回类格式。特别是在有多个后端开发人员参与的情况下,如果不规范返回类,每个人按照个人习惯返回数据,前端将面临各式各样的返回数据,难以统一处理。为解决这个问题,我们需要规范后端的返回数据,并定义一个统一的返回类,所有数......
  • SpringBoot单元测试只${spring.profiles.active}异常
    在使用SpringBoot进行单元测试时,如果遇到「couldnotresolveplaceholder'spring.profiles.active'」的错误提示,通常是因为你在测试用例中使用了@ActiveProfiles注解来激活某些特定的配置文件,但是你的项目中并没有这些指定的配置文件。为了解决这个问题,你需要检查你的测试......
  • 【小小demo】Springboot + Vue 增删改查
    vue-table-ui该工程提供的是一个简单的Vue+Element-UI的表格,增删改查操作。工程代码在最下面。环境jdk1.8ideamavenspringboot2.1.1.RELEASE示例首页查询新增修改删除官方文档Element-Ui:https://element.eleme.cn/#/zh-CN/component/installationV......
  • Springboot集成Netty实现TCP通讯
    Netty测试客户端packagecom.coremain;importcom.coremain.handler.ServerListenerHandler;importio.netty.bootstrap.Bootstrap;importio.netty.buffer.Unpooled;importio.netty.channel.Channel;importio.netty.channel.ChannelFuture;importio.netty.channel.Cha......
  • springboot项目引入公用项目
    <!--公共interface模块--><dependency><groupId>com.hcp</groupId><artifactId>dubbointerface</artifactId><version>0.0.1-SNAPSHOT</version></depende......
  • SpringBoot中实现文件上传下载的三种解决方案(推荐)
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • SpringBoot02_Mybatis和配置文件
    关于本文的大体框架在上一篇博客一、SpringBoot整合Mybatis(一)配置文件​ 引入springboot与mybatis整合包以及java-connector<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • 【redis】哨兵监控原理-springboot 监控
    连接序列图解: 连接步骤:1.boot应用启动时,会从yml文件中配置的多个sentinel中抽取一个进行连接,sentinel有单独的账号密码,需要区分sentinel于redis主节点的账号密码,同时需要将连接的主从节点masterName告知sentinel。2.boot应用与sentinel协议并鉴权成功后,sentinel会将第一步......
  • MongoDB + SpringBoot 的基础CRUD、聚合查询
    1、数据准备1.1、springboot导包springboot版本:2.7.10点击查看代码<!--mongodb的包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifact......
  • SpringBoot(11) -- Logging
    SpringBoot默认使用的日志框架是logback,所以引入Web依赖后直接使用Logger.引入SpringBoot的Web依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>demo的目录结构......