天天看点

springMVC4(4)json与对象互转实例解析请求响应数据转换器格式化数据输入输出实例分析选择合适的数据转换器源码下载

spring3.0的重要接口:httpmessageconveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为user对象,或前端获取用户信息,后端输出user对象转换为json格式传输给前端等。

spring 为我们提供了众多的httpmessageconveter实现类,其中我们可能用得最多的三个实现类是:

实现类

功能

formhttpmessageconverter

从请求和响应读取/编写表单数据。默认情况下,它读取媒体类型 application/x-www-form-urlencoded 并将数据写入<code>multivaluemap&lt;string,string&gt;</code>

marshallinghttpmessageconverter

使用 spring 的 marshaller/un-marshaller 读取/编写 xml 数据。它转换媒体类型为 application/xml

mappingjacksonhttpmessageconverter

使用 jackson 的 objectmapper 读取/编写 json 数据。它转换媒体类型为application/json

转换器的装配方式有两种,一种是通过注册org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter来装配messageconverters,如下所示:

另一种是启用注解<code>&lt;mvc:annotation-driven /&gt;</code>

该注解会会初始化7个转换器:

- bytearrayhttpmessageconverter

- stringhttpmessageconverter

- resourcehttpmessageconverter

- sourcehttpmessageconverter

- xmlawareformhttpmessageconverter

- jaxb2rootelementhttpmessageconverter

- mappingjacksonhttpmessageconverter

通过以上两种方法,我们即可完成我们的转换器注册。

但我们想要在控制层完成数据的输入输出转换,需要通过下列途径:

1. 使用@requestbody和@responsebody对处理方法进行标注。其中@requestbody通过合适的httpmessageconverter将http请求正文转换为我们需要的对象内容。而@responsebody则将我们的对象内容通过合适的httpmessageconverter转换后作为http响应的正文输出。

2. 使用httpentity、responseentity作为处理方法的入参或返回值

通过以上讲解,我们已经有足够的知识准备,来完成我们的实例:将json数据转换为合适的java对象输入,并将java对象转换为符合格式的json字符输出:

装配mappingjacksonhttpmessageconverter需要我们的jackson相关jar包,我们使用maven来管理项目,在pom.xml中配置如下信息:

这里我们使用上面提到的方式二更为便利,在spring容器中加入:

<code>&lt;mvc:annotation-driven /&gt;</code>

关于springmvc所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取

下面是我们的user pojo测试类

下面是我们的控制层测试文件:

上面分别展示了注解和httpentity的用法。关于httpresponse只是在htppentity的基础上进一步对相应信息进行封装,如修改一些相应头信息等

关于以上的getuser()getuser1()能将我们的json字符串转换为相应的对象,我们可以任何参数名输入:

{“id”:10,”password”:”mypassword”,”username”:”myusername”}

在这里我们需要的是需将请求头的contenttype设置为”application/json;utf-8“。这样spring才能找到对应的json解析器对我们的json字符串进行解析。否则会报错误:415 unsupported media type

程序中方法调用user的tostring()在控制台打印字段:

user [id=10, username=asd, password=qwe]

对于以上的getuser2()和getuser3()方法,我们访问如:

<code>http://localhost:8080/springmvc/user/getuser3?id=10&amp;password=qwe&amp;username=asd</code>。然后spring会帮我们自动将参数对应user对象的属性名绑定到方法入参的user对象中(关于复杂对象、集合绑定可参考我后面系列的文章)。根据上面url传入的参数,spring自动将我们的user对象转换为json格式字符串输出,内容如下:

<code>{"id":10,"username":"asd","password":"qwe"}</code>

在前面讲解中,我们通过annotationmethodhandleradapter注册了众多的数据转换器,而spring会针对不同的请求响应媒体类型,spring会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:

首先获取注册的所有httpmessageconverter集合 然后客户端的请求header中寻找客户端可接收的类型,比如 accept application/json,application/xml等,组成一个集合 所有的httpmessageconverter 都有canread和canwrite方法 返回值都是boolean,看这个httpmessageconverter是否支持当前请求的读与写,读对应@requestbody注解, 写对应@responsebody注解 遍历httpmessageconverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的httpmessageconverter,然后return(一般是通过accept和返回值对象的类型进行匹配)