HttpMessageConverter<T>
负责将请求信息转换为一个对象(类型为T),或者将对象(类型为T)输出为一个响应信息。
HttpMessageConverter的工作原理:
HttpMessageConverter有很多实现类。这里我们主要关注Spring MVC搭载了那些实现类。
DispatcherServlet默认装配RequestMappingHandlerAdapter而RequestMappingHandlerAdapter默认装配如下的HttpMessageConverter
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- AllEncompassingFormHttpMessageConverter
- Jaxb2RootElementHttpMessageConverter
引入jackson相关的jar包后默认加入MappingJackson2HttpMessageConverter。
使用HttpMessageConverter<T>将请求信息转化并绑定到处理方法的入参中或将响应结果转换为对应类型的响应信息,Spring提供了两种途径。
- 使用@RequestBody/@ResponseBody对处理方法进行标注。
- 使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值。
当控制器处理方法使用到@RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T>时,Spring首先根据请求头或响应头的Accept属性选择匹配的HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter,若找不到可用的HttpMessageConverter将报错。
@RequestBody与@ResponseBody不需要成对出现。
实例
下载文件:
@RequestMapping("testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
byte [] body = null;
ServletContext servletContext = session.getServletContext();
InputStream in = servletContext.getResourceAsStream("文件的路径");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=abc.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}









网友评论