hooyantsing's Blog

青铜篇_P12_结合Spring请求处理流程讲解注解

字数统计: 541阅读时长: 2 min
2020/07/14

结合Spring请求处理流程讲解注解

20年全新-Spring Boot 2.x从青铜到王者之青铜篇-打造精品中的精品-程序员-编程-架构师-SpringBoot

json是对象序列化的产物。

HttpMessageConverter 将对象序列化,将json反序列化。

c6ec4560906f2fbe242b182c37913796.png

@Controller@RestController 类内都是对外提供HTTP服务的方法。

@Controller

返回String,视图名称

@ResponseBody

返回类 将返回类以默认的json格式返回

1
2
3
public @ResponseBody Article getArticle( @PathVariable("id") Long id ) {
// more code ...
}

如果加上 @ResponseBody ,将省略第6、7步。32ed27e50f76058ae1d01376b577dad2.png

@RestController

相当于 @Controller + @ResponseBody 类内方法都是以默认json格式返回

如何将默认的json格式,变更为以其他格式返回?

例:将以Excel格式返回。

依赖

1
2
3
4
5
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>

自定义类,继承 AbstractHttpMessageConverter<?> 抽象类,并实现 supportsreadInternalwriteInternal 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package xyz.hooy.demo.bronze.p12;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Service;

import java.io.IOException;

//将本类注入
@Service
public class ResponseToXlsConverter extends AbstractHttpMessageConverter<Result> {

//响应头,告诉前端响应的是Excel这种格式,如果是浏览器,就会提供下载而不是页面展示数据。
private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel");

//告诉处理Excel这种数据类型
ResponseToXlsConverter(){
super(EXCEL_TYPE);
}

@Override
protected boolean supports(Class<?> Clazz) {
//仅支持Result对象,将其数据Excel化
return (Result.class == Clazz);
}

//针对于@RequestBody 反序列化的过程。
@Override
protected Result readInternal(Class<? extends Result> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}

//针对于@ResponseBody 序列化的过程。
@Override
protected void writeInternal(Result result, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
final Workbook workbook = new HSSFWorkbook();
final Sheet sheet = workbook.createSheet();

//在Excel里的第一行
final Row row = sheet.createRow(0);
//第一列
row.createCell(0).setCellValue(result.getMessage());
//第二列
row.createCell(1).setCellValue(result.getData().toString());

//写回给客户端,响应
workbook.write(httpOutputMessage.getBody());
}
}

继承与实现关系图:


CATALOG
  1. 1. 结合Spring请求处理流程讲解注解
    1. 1.0.1. @Controller
    2. 1.0.2. @ResponseBody
    3. 1.0.3. @RestController
  2. 1.1. 如何将默认的json格式,变更为以其他格式返回?
    1. 1.1.1. 依赖