【发布时间】:2021-05-26 03:11:39
【问题描述】:
我正在使用 Spring Boot 应用程序并写入 csv 文件。这是控制器方法
@PostMapping(value = "/audit/keys", produces = "text/csv", consumes = "multipart/form-data")
public ResponseEntity<byte[]> getEmployeeReport(
@RequestPart(value="file") MultipartFile multiPartFile,
HttpServletResponse response) {
try {
response.setHeader("Content-Disposition", "attachment; filename=EmployeeRecord.csv");
service.getEmployeeRecords(multiPartFile, response);
} catch (Exception e) {
logger.error("File can not b read", e);
}
return null;
}
这是我的服务方法
public void getEmployeeRecords(MultipartFile multiPartFile,
HttpServletResponse response){
// csv generator
CsvGenerator csvGenerator = CSV_FACTORY.createGenerator(response.getOutputStream());
CsvMapper mapper = new CsvMapper();
mapper.configure(JsonGenerator.Feature.IGNORE_UNKNOWN, true);
mapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS, true);
mapper.enable(CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING);
csvGenerator.writeObject(dao.fetchEmpRecords());
csvGenerator.flush();
csvGenerator.close();
}
我的数据库包含以下记录
empId empName empAddress
123 Roy John Street 2 Nawada
340 Roy Jennings Street # 2 contact $$$
由于第二条记录包含 # $ etc 它没有写入 Csv 但是我可以在响应/预览选项卡上的 UI 上看到这两条记录。但是 EmployeeRecord.csv 只包含一条记录。用 produces = "text/csv; charset=UTF-8" 尝试过但它对我没用,我正在使用 Apace 通用库并想使用 IOUtils 但到目前为止还没有运气:(
【问题讨论】:
-
我认为这与http传输无关。这更像是杰克逊的问题。
-
当你只返回
null时,为什么你的控制器方法的签名是ResponseEntity<byte[]>?为什么你认为这个问题与 Spring Boot 毫无关系?您显示的getEmployeeRecords()不是控制器中调用的那个。你想写入数据(使用POST)还是返回数据(你在DAO上调用fetch)?
标签: java spring csv export-to-csv