SpringMVC处理JSON——使用HttpMessageConverter
处理 JSON
1. 加入 jar 包:
2. 编写目标方法,使其返回 JSON 对应的对象或集合
3. 在方法上添加 @ResponseBody 注解。这里说说@ResponseBody这个注解。我以前一直对这个注解的理解很模糊。其实,与这个注解类似的就是@RequestBody,含义也是类似的,一个是响应体,一个是请求体。因此,@ResponseBody注解的含义就是直接将返回值的内容作为响应体的内容进行返回,而不再要进行常规的视图解析操作。所以啊,如果返回值类型就是String的话,直接返回就行了,不涉及到什么JSON的东西。涉及到JSON格式字符串的情况是,当返回值类型是一个pojo类或者数组类型的,就要转换成JSON格式的字符串,然后再返回给客户端。因此,这才是@ResponseBody的真正含义,它与JSON其实没有必然的联系,只是使用JSON的场景最多而已。
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,HttpOutputMessgaeoutputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
其实,我觉得@ResponseBody和@RequestBody就是基于HttpMessageConverter<T>实现的。
HttpMessageConverter<T> 的实现类
DispatcherServlet 默认装配RequestMappingHandlerAdapter ,而RequestMappingHandlerAdapter 默认装配如下
HttpMessageConverter:
加入 jackson jar 包后, RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:
使用 HttpMessageConverter<T>
- 使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:1、使用 @RequestBody / @ResponseBody 对处理方法进行标注;2、使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值
- 当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错
- @RequestBody 和 @ResponseBody 不需要成对出现
@RequestBody、@ResponseBody 示例