Jackson ObjectWriter 仅写入流中的第一个条目

Pet*_*ter 6 spring jackson kotlin spring-boot jackson-dataformat-csv

我想创建一个 Spring Boot 控制器,它使用流中的数据创建 CSV 文件。我使用 Jackson CSV (jackson-dataformat-csv 2.12.1) 将数据流从数据库写入 StreamingResponseBody。

为了简单起见,我将数据库中的实际数据替换为包含1, 2, 3. 我想要一个如下所示的 CSV 文件:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但它只包含第一个条目 ( 1)。有人可以帮我找出问题吗?

请注意,我不想在服务器上的某个位置创建文件,我想将内容直接流式传输给用户。

我的代码如下所示:

1
2
3
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 1

在 Andriy 的评论的帮助下,我找到了原因和解决方案。Jackson 在完成写入后关闭流,请参阅:ObjectMapper._writeValueAndClose

要更改此行为,您必须设置JsonGenerator.Feature.AUTO_CLOSE_TARGET为 false,如下所示:

val jsonFactory = CsvFactory().configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)
val mapper = ObjectMapper(jsonFactory)
val writer = mapper.writer(CsvMapper().schemaFor(Int::class.java))
Run Code Online (Sandbox Code Playgroud)

注意:没有 的AUTO_CLOSE_TARGET选项,CsvGenerator但使用该JsonGenerator设置也适用于CsvFactory