本篇文章给大家带来的内容是关于spring boot中扩展xml请求和响应的支持的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在之前的所有spring boot教程中,我们都只提到和用到了针对html和json格式的请求与响应处理。那么对于xml格式的请求要如何快速的在controller中包装成对象,以及如何以xml的格式返回一个对象呢?
实现原理:消息转换器(message converter)
在扩展上述问题之前,我们先要知道spring boot中处理http请求的实现是采用的spring mvc。而在spring mvc中有一个消息转换器这个概念,它主要负责处理各种不同格式的请求数据进行处理,并包转换成对象,以提供更好的编程体验。
在spring mvc中定义了httpmessageconverter接口,抽象了消息转换器对类型的判断、对读写的判断与操作,具体可见如下定义:
public interface httpmessageconverter<t> { boolean canread(class<?> clazz, [@nullable](https://my.oschina.net/u/2896689) mediatype mediatype); boolean canwrite(class<?> clazz, [@nullable](https://my.oschina.net/u/2896689) mediatype mediatype); list<mediatype> getsupportedmediatypes(); t read(class<? extends t> clazz, httpinputmessage inputmessage) throws ioexception, httpmessagenotreadableexception; void write(t t, [@nullable](https://my.oschina.net/u/2896689) mediatype contenttype, httpoutputmessage outputmessage) throws ioexception, httpmessagenotwritableexception;}
众所周知,http请求的content-type有各种不同格式定义,如果要支持xml格式的消息转换,就必须要使用对应的转换器。spring mvc中默认已经有一套采用jackson实现的转换器mappingjackson2xmlhttpmessageconverter。
扩展实现
第一步:引入xml消息转换器
在传统spring应用中,我们可以通过如下配置加入对xml格式数据的消息转换实现:
@configurationpublic class messageconverterconfig1 extends webmvcconfigureradapter { [@override](https://my.oschina.net/u/1162528) public void configuremessageconverters(list converters) { jackson2objectmapperbuilder builder = jackson2objectmapperbuilder.xml(); builder.indentoutput(true); converters.add(new mappingjackson2xmlhttpmessageconverter(builder.build())); }}
在spring boot应用不用像上面这么麻烦,只需要加入jackson-dataformat-xml依赖,spring boot就会自动引入mappingjackson2xmlhttpmessageconverter的实现:
<dependency> <groupid>com.fasterxml.jackson.dataformat</groupid> <artifactid>jackson-dataformat-xml</artifactid></dependency>
同时,为了配置xml数据与维护对象属性的关系所要使用的注解也在上述依赖中,所以这个依赖也是必须的。
第二步:定义对象与xml的关系
做好了基础扩展之后,下面就可以定义xml内容对应的java对象了,比如:
@data@noargsconstructor@allargsconstructor@jacksonxmlrootelement(localname = user)public class user { @jacksonxmlproperty(localname = name) private string name; @jacksonxmlproperty(localname = age) private integer age;}
其中:@data、@noargsconstructor、@allargsconstructor是lombok简化代码的注解,主要用于生成get、set以及构造函数。@jacksonxmlrootelement、@jacksonxmlproperty注解是用来维护对象属性在xml中的对应关系。
上述配置的user对象,其可以映射的xml样例如下(后续可以使用上述xml来请求接口):
<user> <name>aaaa</name> <age>10</age></user>
第三步:创建接收xml请求的接口
完成了要转换的对象之后,可以编写一个接口来接收xml并返回xml,比如:
@controllerpublic class usercontroller { @postmapping(value = /user, consumes = mediatype.application_xml_value, produces = mediatype.application_xml_value) @responsebody public user create(@requestbody user user) { user.setname(didispace.com : + user.getname()); user.setage(user.getage() + 100); return user; }}
最后,启动spring boot应用,通过postman等请求工具,尝试一下这个接口,可以看到请求xml,并且返回了经过处理后的xml内容。(案例代码)
以上就是spring boot中扩展xml请求和响应的支持的方法介绍的详细内容。