spring框架通过HttpMessageConverter实现序列化与反序列化,默认的请求响应处理格式是Json,这里通过自定义的方式,实现响应excel格式。
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--excel 处理依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
</dependencies>
domain/users
@Data
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class Users {
private int id;
private String username;
private String password;
private String email;
}
自定义的响应实体XlsDownloadResponse
@Data
@NoArgsConstructor
@AllArgsConstructor
public class XlsDownloadResponse {
private boolean isOk;
private int code;
private String message;
private Object Data;
public static XlsDownloadResponse success(Object obj){
XlsDownloadResponse xlsDownloadResponse = new XlsDownloadResponse();
xlsDownloadResponse.setOk(true);
xlsDownloadResponse.setCode(200);
xlsDownloadResponse.setMessage("请求响应成功");
xlsDownloadResponse.setData(obj);
return xlsDownloadResponse;
}
}
Controller
@RestController
public class UserController {
@GetMapping("/download/users")
public XlsDownloadResponse searchUsers(){
List<Users> usersList = new ArrayList<>();
for(int i = 0; i < 10 ; i++){
usersList.add(new Users(i,"sabot"+ i ,"password"+i,"sabot_v@163.com"));
}
return XlsDownloadResponse.success(usersList);
}
}
关键代码,自定义ResponseToXlsConverter
继承AbstractHttpMessageConverter< T >
,重写方法实现自定义的响应格式。
@Service
public class ResponseToXlsConverter extends AbstractHttpMessageConverter<XlsDownloadResponse> {
//定义响应类型
private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel");
public ResponseToXlsConverter(){
super(EXCEL_TYPE);
}
@Override
protected boolean supports(Class<?> aClass) {
return (aClass == XlsDownloadResponse.class);
}
//序列化
@Override
protected XlsDownloadResponse readInternal(Class<? extends XlsDownloadResponse> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
//反序列化
@Override
protected void writeInternal(XlsDownloadResponse xlsDownloadResponse, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("sheet0");
List<Users> users = (List<Users>)xlsDownloadResponse.getData();
for(int i = 0; i < users.size(); i++){
Users user = users.get(i);
HSSFRow row = sheet.createRow(i);
HSSFCell id =row.createCell(0);
id.setCellValue(user.getId());
HSSFCell username =row.createCell(1);
username.setCellValue(user.getUsername());
HSSFCell password =row.createCell(2);
password.setCellValue(user.getPassword());
HSSFCell email =row.createCell(3);
email.setCellValue(user.getEmail());
}
wb.write(httpOutputMessage.getBody());
}
}
测试接口: http://127.0.0.1:8080/downlod/users