Как преобразовать коллекцию в csv с помощью jackson в java spring?

У меня проблема с преобразованием java.util.Collection в файл csv с помощью jackson.

В следующем коде вы можете увидеть метод преобразования коллекции в строку 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;
}

person MCW    schedule 03.07.2018    source источник
comment
С какой именно проблемой вы столкнулись с этим кодом? Вы не можете использовать CsvMapper так, как он у вас есть, или это ошибка?   -  person Joe W    schedule 03.07.2018
comment
Проблема в том, что я не должен использовать байтовые массивы. Я должен использовать библиотеку Джексона, чтобы преобразовать коллекцию в CSV-файл.   -  person MCW    schedule 03.07.2018


Ответы (1)


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

@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 Контроллер

person Joe W    schedule 03.07.2018
comment
Спасибо, если я использовал последние 2 строки вашего кода, я получил правильную строку csv. Это лучше, чем моя версия кода. - person MCW; 03.07.2018