文档章节

SpringMVC接收xml格式参数

寒武没有纪
 寒武没有纪
发布于 2018/07/04 13:40
字数 392
阅读 598
收藏 6

问题

在对接银行过程中,银行回调时请求参数格式为xml,要求返回格式也为xml(CDATA包裹),利用SpringMVC该怎么处理。

测试

xml格式参数为:

<xml>
  <order_id><![CDATA[201807031109358406949]]></order_id>
  <sign><![CDATA[f296ce56231147869aa413f1edef6403]]></sign>
  <data><![CDATA[{"application_status":"review"}]]></data>
  <uuid><![CDATA[123654978945]]></uuid>
</xml>

提供接受参数的对象

@Data //lombok注解,无需手动添加getter/setter
@XmlRootElement(name = "xml") 
@ToString //lombok注解,无需手动添加toString方法
public class XmlRequest {

    private String order_id;
    private String sign;
    private String data;
    private String uuid;
}

返回参数对象

@Data
@XmlRootElement(name = "xml")
public class XmlResponse {

    private String code;
    private String msg;

    public XmlResponse() {
    }

    public XmlResponse(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

处理xml格式参数接口

    /**
     * 处理xml格式参数
     *
     * @param xmlRequest
     * @return
     */
    @RequestMapping(value = "/handleXmlParam", produces = {"application/xml;charset=UTF-8"})
    @ResponseBody
    public String handleXmlParam(@RequestBody XmlRequest xmlRequest) throws Exception {
        logger.info("XmlRequest:{}", xmlRequest);
        XmlResponse response = new XmlResponse("1", "success");
        return ojbectToXmlWithCDATA(XmlResponse.class, response);
    }

    /**
     * Java对象转换为CDATA包裹XML
     *
     * @param clazz
     * @param obj
     * @return
     * @throws Exception
     */
    public static String ojbectToXmlWithCDATA(Class clazz, Object obj) throws Exception {

        JAXBContext context = JAXBContext.newInstance(clazz);
        // 配置OutputFormat处理CDATA
        OutputFormat of = new OutputFormat();
        of.setCDataElements(new String[]{"^code", "^msg"});
        of.setPreserveSpace(true);
        of.setIndenting(true);
        // 创建序列化
        ByteArrayOutputStream op = new ByteArrayOutputStream();
        XMLSerializer serializer = new XMLSerializer(op, of);
        SAXResult result = new SAXResult(serializer.asContentHandler());
        Marshaller mar = context.createMarshaller();
        mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        mar.marshal(obj, result);

        return op.toString("utf-8");
    }

使用Postman模拟请求,响应也为xml格式 postman模拟xml格式参数请求

日志打印XmlRequest对象,说明参数已经正常接收

XmlRequest:XmlRequest(order_id=m180702762500000201807031109358406949, sign=wxd2a1d0594082a206, data={"application_status":"review"}, uuid=123654978945)

© 著作权归作者所有

寒武没有纪
粉丝 13
博文 31
码字总数 32748
作品 0
杨浦
程序员
私信 提问
Spring的WebServiceTemplate访问WebService的方法及其本质原理

WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML. 本文简单介绍一下如何通过Spring提供的WebServiceTemplate访问Webserv...

晨曦之光
2012/04/25
2.9K
0
SpringMVC转换JSON数据(1)

SpringMVC提供了处理JSON格式请求/响应的 HttpMessageConverter:MappingJackson2HttpMessageConverter。利用Jackson开源类包处理JSON格式的请求或响应消息。 我们需要做的: 在Spring容器中为...

武小猪
2018/06/26
0
0
Spring Boot中如何扩展XML请求和响应的支持

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

翟永超
2018/09/21
0
0
一文读懂SpringMVC中的数据绑定

Struts2 和 SpringMVC 都是 Web 开发中视图层的框架,两者都实现了数据的自动绑定,都不需要我们手动获取参数然后关联到对应的属性上,下面就谈谈两者的区别。 Spring MVC 是基于方法的,通过...

Java高级技术
2018/09/26
0
0
分布式服务架构之java远程调用技术浅析

在 分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、 Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底...

aldo
2012/11/20
0
2

没有更多内容

加载失败,请刷新页面

加载更多

用Python帮你上马,哪里无码打哪里

目录 0 引言 1 环境 2 需求分析 3 代码实现 4 代码全景展示 5 后记 0 引言 所谓的像素图,就是对图像做一个颗粒化的效果,使其产生一种妙不可言的朦胧感。费话不多说,先来看一张效果图。 <c...

上海小胖
29分钟前
1
0
python from import与import as 的含义

from os import makedirs, unlink, sep #从os包中引入 makedirs.unlink,sep类 from os.path import dirname, exists, isdir, splitext 从 os包中的path类中引入 dirmame exists 等方法 impo......

dillonxiao
29分钟前
1
0
【转】URL最大长度问题

今天在测试Email Ticket的时候发现在进行Mark as Read/Unread操作时,请求是通过GET方式进行的。URL中列出了所有参与该操作的Ticket Id。于是,我想起GET请求是有最大长度限制的。遂输入超长...

ZhangLG
32分钟前
0
0
Segment段

CurrentHashMap和HashMap相比支持并发操作,整个CurrentHashMap是由一个个的Segment组成的,也是就是常说的分段锁 Segment继承了重入锁ReentrantLock来进行加锁, 可以简单的把CurrentHashMa...

周慕云
33分钟前
0
0
JS Date 自定义格式化方法

JS Date 自定义格式化方法 Date 时间对象 快速 自定义格式化 定义方法 // 自定义格式化方法Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth()+1, ......

DrChenXX
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部