spring基于xml格式数据交换的前后端配置与使用 之 Jackson方式

本文介绍了在Spring中使用Jackson进行XML格式的数据交换。通过添加MappingJackson2XmlHttpMessageConverter到配置文件,并在Controller中设置RESTful接口,实现了XML数据的接收和发送。文中还展示了DTO类的部分代码,说明了如何使用注解来修改XML元素的别名。此外,文章提到了另一种使用XStream实现XML数据交换的配置,详细内容可参考另一篇博客。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MappingJackson2XmlHttpMessageConverter方式解析xml(支持注解修改元素别名)配置及代码如下:

xml配置文件中添加converter


<bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
                <property name="supportedMediaTypes">
                	<list>
                		<value>application/xml;charset=UTF-8</value>
                	</list>
                </property>
                <property name="prettyPrint" value="false"/>
            </bean>

pom 文件(在原来的基础上添加了jackson-dataformat-xml的依赖,这里jackson为2.8.7版本)

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-xml</artifactId>
			<version>${jackson.version}</version>
		</dependency>


controller文件(这个controller本就是@restcontroller)

@RequestMapping(value = "txml", headers = { "content-type=application/xml;charset=UTF-8"})
	public Object testXml(@RequestBody Xml xml) {

                // 这部分主要打印看看,验证request xml方式入参成功
		try {
			ObjectMapper mapper = new ObjectMapper();
			mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
					.enable(JsonGenerator.Feature.IGNORE_UNKNOWN).enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
			System.out.println(mapper.writeValueAsString(xml));// 打印入参数据可以看到成功入参
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}

                // response出参数据
		Test_DtoOut tdo = new Test_DtoOut();
		tdo.code = 200;
		tdo.msg = xml.getToUserName();
		return tdo;
	}


两个出入参dto(只截部分代码)

package com.mufeng.dto.in;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;

@JsonRootName(value="out") // 给xml根节点别名,不然会带包名
public class Xml {
	@JsonProperty(value="toUserName")// 变量对应的入参数据标签名,这里可以使实现与入参数据标签名不同
	String toUserName;
	@JsonProperty(value="fromUserName")
	String fromUserName;
	@JsonProperty(value="CreateTime")
	Long createTime;
	@JsonProperty(value="MsgType")
	String msgType;
	@JsonProperty(value="Event")
	String event;

package com.mufeng.dto.out;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

//@JacksonXmlRootElement(localName="out")
@JsonRootName(value="out")
public class Test_DtoOut {

	@JsonProperty(value="codes")
	public Integer code;
        // 不给别名xml数据默认的标签名与属性名一致
	public String msg;

前端文件html(注意前端代码要放到服务器上,浏览器输入url,否则contentType不会起作用)

<html>  
<head>  
<meta http-equiv="Content-Type" content="application/xml; charset=UTF-8">  
<title>测试接收XML格式的数据</title>  
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>  
<!-- <script type="text/javascript" src="js/json2.js"></script>  -->
<script type="text/javascript">  
$(document).ready(function(){  
    sendxml();  
});  
  
function sendxml(){  
    var xmlData = "<out><toUserName>toUser</toUserName><fromUserName>FromUser</fromUserName><CreateTime>123456789</CreateTime><MsgType>event</MsgType><Event>subscribe</Event></out>";
   
	$.ajax({
            type: "POST",
            url: "http://localhost:8080/valida/webctrl/demo/txml",
                
                // data sent is xml
				contentType: "application/xml; charset=utf-8",
                data: xmlData, 
                // data in response will expected xml
                dataType: "xml",
				processData: false,
                anysc: false,
				beforeSend: function(request) {
						
                       request.setRequestHeader('Access-Control-Allow-Origin: *');
					   request.setRequestHeader('Access-Control-Allow-Methods: POST,GET,OPTIONS');
					   request.overrideMimeType('application/xml; charset=utf-8')
					   console.log(JSON.stringify(request));
                 },
                success: function (result) { 
					console.log(result);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(errorThrown + ':' + textStatus); // 错误处理
                }
            });
		
}  
</script>  
</head>  
<body>  
</body>  
</html>  

后端控制台打印

{"toUserName":"toUser","fromUserName":"FromUser","CreateTime":123456789,"MsgType":"event","Event":"subscribe"}

前端接收到返回值

<out><msg>toUser</msg><codes>200</codes></out>



另外一种使用xstream实现xml数据交换的配置,详见另一篇博客

http://blog.youkuaiyun.com/vincent_field/article/details/78533426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值