Как конвертировать коллекцию в CSV с Джексоном в Java Spring? - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с преобразованием java.util.Collection в файл csv с Джексоном.

В следующем коде вы можете увидеть метод для преобразования коллекции в csv-строку.

Но мне нужен метод для преобразования коллекции с com.fasterxml.jackson. Enum "DownloadType" получает столбец и заголовки для CSV-файла.

У вас есть идея, чтобы исправить их?

@RequestMapping(value = "/csv",
            produces = {"text/csv"},
            consumes = {"application/json"},
            method = RequestMethod.POST)
public ResponseEntity<Object> exportCsv()
{
    ResponseEntity<Object> response = null;
    try
    {
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_TYPE, "text/csv; charset=UTF-8");
            headers.add(HttpHeaders.CACHE_CONTROL, "no-store, must-revalidate");
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"export.csv\"");
            headers.add(HttpHeaders.EXPIRES, "0");

            byte[] csvBytes = null;
            byte[] headerBytes = null;
            byte[] lineBytes = null;
            CsvMapper mapper = new 
            Collection<User> users = getUsers()
            headerBytes = DownloadType.USER.getHeaderLine().getBytes("UTF-8");
            lineBytes = mapper.writer(DownloadType.USER.getCsvSchema()).writeValueAsBytes(users);
            if (headerBytes != null && lineBytes != null)
            {
                csvBytes = new byte[headerBytes.length + lineBytes.length];
                System.arraycopy(headerBytes, 0, csvBytes, 0, headerBytes.length);
                System.arraycopy(lineBytes, 0, csvBytes, headerBytes.length, lineBytes.length);
            }
            response = new ResponseEntity<>(csvBytes, headers, HttpStatus.OK);


    }
    catch (Exception e)
    {
        LOG.error(e.getMessage(), e);
    }
    return response;
}

1 Ответ

0 голосов
/ 03 июля 2018

Может быть, попробовать что-то вроде этого. При записи данных непосредственно в ответ сервлета строка будет возвращена непосредственно клиенту, как есть, без форматирования или пост-обработки.

@RequestMapping(value = "/csv",
            produces = {"text/csv"},
            consumes = {"application/json"},
            method = RequestMethod.POST)
public void exportCsv(HttpServletResponse response)
{
    ...
    String headerString = DownloadType.USER.getHeaderLine()
    String data = mapper.writer(DownloadType.USER.getCsvSchema()).writeValueAsString(users);
response.setContentType("text/plain; charset=utf-8");
    response.getWriter().print(headerString);
    response.getWriter().print(data);

Адаптировано из: Как вернуть данные CSV в браузере из Spring Controller

...