Конечная точка Rest API для создания файла CSV с данными, собранными из БД - PullRequest
0 голосов
/ 19 сентября 2019

Застрял в составлении CSV-файла из списка собранных данных из БД в реактивном режиме.

Мой контроллер:

@RestController
@RequestMapping("/v1/foo")
@RequiredArgsConstructor
public class FooController {

    private final FooService paymentService;

    @GetMapping(value = "/export")
    @Validated
    public Mono<ResponseEntity> export(FooQuery query) {
        return fooService.export(query) // return Flux<Foo>
                             .collectList()
                             .map(foos -> ResponseEntity.ok()
                                                        .contentType(MediaType.valueOf("text/csv"))
                                                        // Somehow I need to generate CSV format resource and pass it to body(), but no clue how to do that.
                                                        .body(foos));
    }

}

Как я могу сгенерировать ресурс формата CSV для передачи его в body ()?

Решение:

@GetMapping(value = "/export", produces = {"text/csv"})
    @Validated
    public Mono<ResponseEntity> export(FooQuery query) {
        return fooService.export(query) // return Flux<Foo>
                             .collectList()
                             .map(foos -> ResponseEntity.ok()
                                                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=export.csv")
                                                        .body("ffd;fdfddf;ddddd;")); 
                                                        // Need to convert List<Foo> to correct csv string that it'll work otherwise 406 NOT_ACCEPTABLE "Could not find acceptable representation"
    }

1 Ответ

0 голосов
/ 19 сентября 2019

когда у вас есть String csv Im, использующий объект HttpServletResponse вместо ResponseEntity, например:

 response.addHeader("Access-Control-Expose-Headers", "content-disposition, Content-Type");
            response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + filename);
            response.setContentType("text/csv");
            OutputStream out = response.getOutputStream();
            out.write(csv.getBytes());
            out.flush();
...