如何在 Spring Rest 中接受和解析带有 Jackson 的 csv
How to accept and parse a csv w/ Jackson in Spring Rest
我需要做什么才能上传 csv 文件并使用 Jackson 自动解析它?只需使用下面的内容,我就会得到“不支持的媒体类型”,这让我觉得我缺少配置。
@RestController
@RequestMapping("/upload")
public class Uploader {
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody List<MyDataType> myFile) {
return myFile.toString();
}
}
@Data
@JsonPropertyOrder({ "item1", "item2" })
public class MyDataType {
public String item1;
public String item2;
}
这是您需要的:-
依赖性:-
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.5</version>
</dependency>
然后在控制器
@PostMapping("/uploadCSVFile")
public Response uploadSingleCSVFile(@RequestParam("csvfile") MultipartFile csvfile) {
Response response = new Response();
InputStream file = csvfile.getInputStream();
List<Object> lstCustomers = ApacheCommonsCsvUtil.parseCsvFile(file);
}
代码仅供参考,请格式化测试。
在 REST-API 中,文件上传通常作为多部分表单数据请求完成,以确保您还可以传递即 JSON 数据以及您的文件。因此,您可能需要将媒体类型添加到 @PostMapping
注释中,例如 @PostMapping(consumes = {"multipart/form-data"})
.
然后您可以将文件注入您的控制器方法并在那里解析 CSV。
@PostMapping(consumes = {"multipart/form-data"})
@ResponseStatus(HttpStatus.CREATED)
public List<MyDataType> create(@RequestPart("file") MultipartFile file) throws IOException {
CsvMapper csvMapper = new CsvMapper();
CsvSchema schema = csvMapper.schemaFor(MyDataType.class).withHeader().withColumnSeparator(';');
MappingIterator<MyDataType> parsedData = csvMapper.readerWithSchemaFor(MyDataType.class)
.with(schema)
.readValues(new String(file.getBytes(), StandardCharsets.UTF_8));
return parsedData.readAll();
}
您可能还需要添加以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
</dependency>
我需要做什么才能上传 csv 文件并使用 Jackson 自动解析它?只需使用下面的内容,我就会得到“不支持的媒体类型”,这让我觉得我缺少配置。
@RestController
@RequestMapping("/upload")
public class Uploader {
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody List<MyDataType> myFile) {
return myFile.toString();
}
}
@Data
@JsonPropertyOrder({ "item1", "item2" })
public class MyDataType {
public String item1;
public String item2;
}
这是您需要的:- 依赖性:-
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.5</version>
</dependency>
然后在控制器
@PostMapping("/uploadCSVFile")
public Response uploadSingleCSVFile(@RequestParam("csvfile") MultipartFile csvfile) {
Response response = new Response();
InputStream file = csvfile.getInputStream();
List<Object> lstCustomers = ApacheCommonsCsvUtil.parseCsvFile(file);
}
代码仅供参考,请格式化测试。
在 REST-API 中,文件上传通常作为多部分表单数据请求完成,以确保您还可以传递即 JSON 数据以及您的文件。因此,您可能需要将媒体类型添加到 @PostMapping
注释中,例如 @PostMapping(consumes = {"multipart/form-data"})
.
然后您可以将文件注入您的控制器方法并在那里解析 CSV。
@PostMapping(consumes = {"multipart/form-data"})
@ResponseStatus(HttpStatus.CREATED)
public List<MyDataType> create(@RequestPart("file") MultipartFile file) throws IOException {
CsvMapper csvMapper = new CsvMapper();
CsvSchema schema = csvMapper.schemaFor(MyDataType.class).withHeader().withColumnSeparator(';');
MappingIterator<MyDataType> parsedData = csvMapper.readerWithSchemaFor(MyDataType.class)
.with(schema)
.readValues(new String(file.getBytes(), StandardCharsets.UTF_8));
return parsedData.readAll();
}
您可能还需要添加以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
</dependency>