Jackson ObjectMapper - запись значения в поток - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть требование извлекать и записывать тысячи записей из БД, конвертировать в json и записывать в zip-файл. Я могу написать ниже, а также реализацию.

    @Override
    public StreamingResponseBody fetchAndWriteOrderAllocationsToFile(LocalDate date) {
        int orderCount = orderDao.getOrderCount(date);
        // Pagination
        return outputStream -> {
            try (ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(outputStream))) {
                zipOut.putNextEntry(new ZipEntry("report.txt"));
                int startIndex = 0, count = orderCount;
                do {
                    List<String> orderSerialNos = orderDao.getOrderSerialNos(date, startIndex, PAGESIZE);
                    orderSerialNos.parallelStream().forEach(orderSerialNo -> {
                        try {
                            writeToStream(zipOut, allocationsService.getAllocationsFromOrderItems(orderSerialNo), objectMapper);
                        } catch (Exception e) {
                            writeToStream(zipOut, Allocations.builder()
                                .orderSerialNo(orderSerialNo)
                                .build(), objectMapper);
                        }
                    });
                    count -= PAGESIZE;
                    startIndex += PAGESIZE;
                } while (count > 0);
            }
        };
    }

    private static void writeToStream(OutputStream outputStream,
                                      Object result,
                                      ObjectMapper objectMapper) {
        try {
            objectMapper.writeValue(outputStream, result);
        } catch (IOException e) {
            log.error("Error writing results to stream", e);
        }
    }

Однако я хотел бы ввести символ новой строки (или запятую) после каждой записи json в файл. Самым близким, что я получил, было переопределение метода PrettyPrinter.writeEndObject к чему-то подобному ниже и использование переопределенного класса PrettyPrinter. Это, очевидно, добавляет новый символ строки ко всем подобъектам json, а также к каждому новому json. Ожидается, что символ новой строки будет только после каждого json. Есть ли способ выполнить sh это?


        @Override
        public void writeEndObject(JsonGenerator g, int nrOfEntries) throws IOException {
            g.writeRaw("}\n");
        }

Выше код дает:

{"orderSerialNo":"1234-ABCD","orderId":1,"shippingAllocations":[{"recipientId":25,"itemId":3893814,"itemSku":"ABC","quantity":1,"shippingItemId":3893815,"shippingSku":"DEF","shipperId":66,"allocation":0}
],"sdAllocations":[],"idAllocations":[]}
{"orderSerialNo":"6789-EFGH","orderId":2,"shippingAllocations":[{"recipientId":45,"itemId":88,"itemSku":"BLAH","quantity":1,"shippingItemId":78,"shippingSku":"HELP","shipperId":99,"allocation":7.95}
],"sdAllocations":[],"idAllocations":[]}

Ожидается:

{"orderSerialNo":"1234-ABCD","orderId":1,"shippingAllocations"[{"recipientId":25,"itemId":3893814,"itemSku":"ABC","quantity":1,"shippingItemId":3893815,"shippingSku":"DEF","shipperId":66,"allocation":0}],"sdAllocations":[],"idAllocations":[]}
{"orderSerialNo":"6789-EFGH","orderId":2,"shippingAllocations":[{"recipientId":45,"itemId":88,"itemSku":"BLAH","quantity":1,"shippingItemId":78,"shippingSku":"HELP","shipperId":99,"allocation":7.95}],"sdAllocations":[],"idAllocations":[]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...