jacksonobjectwriter只写流中的第一个条目

azpvetkf  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(412)

我想创建一个spring引导控制器,它使用流中的数据创建一个csv文件。我使用jackson csv(jackson dataformat csv 2.12.1)将数据流从db写入streamingresponsebody。
为了简单起见,我用一个包含 1, 2, 3 . 我想要一个如下所示的csv文件:

1
2
3

但它只包含第一个条目( 1 ). 有人能帮我找出问题吗?
请不要说我不想在服务器上的某个地方创建文件,我想直接将内容流式传输给用户。
我的代码如下所示:

import com.fasterxml.jackson.dataformat.csv.CsvMapper
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody
import javax.servlet.http.HttpServletResponse

@RestController
@RequestMapping(value = ["/test"], produces = [MediaType.TEXT_HTML_VALUE])
class TestController {

    @GetMapping("/download", produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
    fun download(response: HttpServletResponse): ResponseEntity<StreamingResponseBody>? {
        response.setHeader("Content-Disposition", "attachment;filename=download.csv")
        response.status = HttpServletResponse.SC_OK

        val mapper = CsvMapper()
        val schema = mapper.schemaFor(Int::class.java)
        val writer = mapper.writer(schema)
        val input = listOf(1, 2, 3).stream()

        val stream = StreamingResponseBody { outputStream ->
            input.forEach { entity ->
                writer.writeValue(outputStream, entity)
            }
        }

        return ResponseEntity
            .ok()
            .header("Content-Disposition", "attachment;filename=download.csv")
            .body(stream)
    }
}
uqxowvwt

uqxowvwt1#

在安德烈评论的帮助下,我找到了原因和解决办法。jackson在完成对流的写入后关闭流,请参阅:objectmapper.\u writevalueandclose。
要改变这种行为,你必须设置 JsonGenerator.Feature.AUTO_CLOSE_TARGET 假象:

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

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

0yg35tkg

0yg35tkg2#

在代码中写入流时未看到指定的列格式化程序。你能试一下吗-

CsvMapper mapper = new CsvMapper();
    CsvSchema schema = mapper.schemaFor(Dymmy.class);
    schema = schema.withColumnSeparator('\t');

相关问题