SpringMVC(十四)_处理 JSON:使用 HttpMessageConverter

       前言:本篇主要介绍SpringMVC如何处理Json数据,包括接收和响应json数据

本篇文章重点关注以下问题:

  • 处理json数据示例
  • 关注HttpMessageConverter<T>

1. 处理Json数据的样例

         SpringMVC处理Json数据的步骤可以说是简单到没朋友,总共三步:

1. 加入 jar 包(开发过程中,这一步也就无需考虑了):

SpringMVC(十四)_处理 JSON:使用 HttpMessageConverter

2. 编写目标方法,使其返回 JSON 对应的对象或集合;

3. 在方法上添加 @ResponseBody 注解;

     返回可以是个Map集合,也可是key-value形式的List集合以返回json数组

@RequestMapping("dataBinder/getCmpVo.action")
@ResponseBody
public Map<String, Object> getCmpVo(UserVo user){
    System.out.println("【自定义复合类型】" + user);
        
    Map<String, Object> map = new HashMap<>();
    map.put("user", user);
    return map;
}

       完成上述三个步骤,SpringMVC就可以自动给前台响应json数据,是不是相当简单。

2. 聊聊HttpMessageConverter<T>

        HttpMessageConverter<T> 是Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息。

       HttpMessageConverter<T>接口定义的方法有:

  • Boolean canRead(Class<?> clazz,MediaType – mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等);
  • Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。
  • LIst<MediaType> getSupportMediaTypes():该转换器支持的媒体类型。
  • T read(Class<? extends T> clazz,HttpInputMessage inputMessage– ):将请求信息流转换为 T 类型的对象。
  • void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为contentType。

       其工作流程如下:

SpringMVC(十四)_处理 JSON:使用 HttpMessageConverter

2.1 SpringMVC内置HttpMessageConverter实现类

名称作用读支持 MediaType写支持 MediaType
ByteArrayHttpMessageConverter数据与字节数组的相互转换\/\application/octet-stream
StringHttpMessageConverter数据与 String 类型的相互转换text/\*text/plain
FormHttpMessageConverter表单与 MultiValueMap的相互转换application/x-www-form-urlencodedapplication/x-www-form-urlencoded
SourceHttpMessageConverter数据与 javax.xml.transform.Source 的相互转换text/xml 和 application/xmltext/xml 和 application/xml
MarshallingHttpMessageConverter使用 Spring 的 Marshaller/Unmarshaller 转换 XML 数据text/xml 和 application/xmltext/xml 和 application/xml
MappingJackson2HttpMessageConverter使用 Jackson 的 ObjectMapper 转换 Json 数据application/jsonapplication/json
MappingJackson2XmlHttpMessageConverter使用 Jackson 的 XmlMapper 转换 XML 数据application/xmlapplication/xml
BufferedImageHttpMessageConverter数据与 java.awt.image.BufferedImage 的相互转换Java I/O API 支持的所有类型Java I/O API 支持的所有类型

2.2 使用HttpMessageConverter

       HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中:

  • 使用 @RequestBody对处理方法进行标注;
  • 使用HttpEntity<T>作为处理方法的入参;

       HttpMessageConverter<T>将响应结果转为对应类型的响应信息:

  • 使用 @ResponseBody对处理方法进行标注;
  • 使用ResponseEntity<T>作为返回值;
       Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错。(@RequestBody 和 @ResponseBody不需要成对出现)

相关推荐