У меня есть проект AngularJS, который запрашивает приложение Spring Boot.
Тогда приложение Spring Boot вернет данные в байтах, которые впоследствии можно будет загрузить в виде файла Excel, например:
Приложение контроллера Spring Boot:
public ResponseEntity generateExcelReport(@RequestBody ArrayList<SearchCriteria> searchCriteriaList) {
Query dynamicQuery = new Query();
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Disposition", "attachment");
try {
List<Investment> resultList = investmentService.findByDynamicQuery(dynamicQuery);
Workbook workbook = myService.generateExcelReport(resultList);
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.write(out);
byte[] bArray = out.toByteArray();
ByteArrayResource resource = new ByteArrayResource(bArray);
workbook.close();
out.close();
out.flush();
return ResponseEntity
.ok()
.headers(responseHeaders)
.contentLength(resource.getByteArray().length)
.contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
.body(resource);
} catch (IOException e) {
return ResponseEntity.badRequest().body(e);
}
}
Но я хочу улучшить этот код, возвращая ResponseEntity
со статусом 204, если resultList
пусто, например:
Обновление:
public ResponseEntity generateExcelReport(@RequestBody ArrayList < SearchCriteria > searchCriteriaList) {
Query dynamicQuery = new Query();
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Disposition", "attachment");
try {
List < Investment > resultList = investmentService.findByDynamicQuery(dynamicQuery);
// If there are no results found, throw a 204 No Content back to front-end
// So that there is no Excel generation involved.
if (resultList.isEmpty()) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).body("There are no results found.");
}
...
return ResponseEntity
.ok()
.headers(responseHeaders)
.contentLength(resource.getByteArray().length)
.contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
.body(resource);
} catch (IOException e) {
return ResponseEntity.badRequest().body(e);
}
}
Это фрагмент AngularJS для внешней стороны
ReportService.generateExcelReport($scope.searchCriteriaList)
.then(function (responseObj) {
if (responseObj.status === 204) {
return SweetAlert.swal("No results", responseObj.data, "warning");
}
// responseObj.data = Excel bytes returned by Spring in this case
var blob = new Blob([responseObj.data], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
});
FileSaver.saveAs(blob, "myreport.xlsx");
swal.close();
})
Но моя проблема в том, что мой запрос $ http.post содержит responseType: "arraybuffer"
как часть запроса.
Из-за этого, даже если я возвращаю строку на стороне сервера, как это:
return ResponseEntity.status(HttpStatus.NO_CONTENT).body("There are no results found.");
Я все еще получаю буфер массива в данных ответа.И я не могу получить доступ к строке.
$ http.Snipet запроса:
generateExcelReport: function (searchCriteriaList) {
var requestConfig = {
responseType: "arraybuffer",
headers: {
"Content-Disposition": "attachment"
}
};
var url = "my-api/generate-paiwi-reports-excel"
return $http.post(url, searchCriteriaList, requestConfig);
}
Я не уверен, что я иду в правильном направлении.Пожалуйста помоги.=) Заранее большое спасибо.=) * * Тысяча тридцать одна