Как написать List<Number> с помощью OpenCSV?

У меня есть следующее поле внутри объекта StacItem:

@JsonProperty
private List<Number> bbox = null;

Я сделал базовую реализацию с OpenCSV, чтобы записать этот объект в CSV, и он в основном работает с этим кодом (я показываю только соответствующую часть):

final StatefulBeanToCsv<Object> beanToCSV = new StatefulBeanToCsvBuilder<>(writer)
                .withSeparator(';')
                .build();
        for(StacItem item : items){
            beanToCSV.write(item);
        }
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set(HttpHeaders.CONTENT_TYPE, "text/csv");
        httpHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=exportItems.csv");
        logger.info("END WRITING");
        return new ResponseEntity<>(new FileSystemResource(file), HttpStatus.OK);

Вот поворот! В журналах моего Microservice я вижу полную структуру этого StacItem, и в нем должно быть это поле bbox:

bbox=[8.24275148213394, 45.5050129344147, 7.62767704092889, 45.0691351737573]

Пока моя реализация возвращает только это:

"8.24637830863774"

Итак, когда я открываю свой CSV, я просто нашел столбец «bbox» с одним значением, но мне нужны и другие. Не могли бы вы сказать мне, почему он останавливается на первом или как получить остальные 3?

ОБНОВИТЬ: Я обнаружил, что это делает трюк! Но затем... он экспортирует только это единственное поле для каждого StacItem, поэтому я теряю все остальные поля в своем объекте.

@CsvBindAndSplitByName(elementType = Number.class, writeDelimiter = ",")
    @JsonProperty("bbox")
    private List<Number> bbox = null;

Спасибо

Куда вы смываете или закрываете свой писатель?

k314159 12.05.2022 11:56

Привет, k314159, я использую Try-With-Resources, так что это происходит автоматически

Unearthly 12.05.2022 12:03

Но я не вижу никаких попыток с ресурсами в вашем методе выше. Возможно, вы закрываете его после, вы читаете файл и передаете его обратно в свой API. Тогда вы не читаете полное содержимое файла, потому что то, что вы только что написали, еще не было сброшено.

k314159 12.05.2022 12:19

Спасибо за ваш ответ k3, я не думал об этом, к сожалению, смещение возврата после закрытия попытки с ресурсами не изменило результат. (Это не видно в приведенном выше коде, потому что я просто показываю соответствующий фрагмент)

Unearthly 12.05.2022 12:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пробовали измениться?

 beanToCSV.write(item); -> beanToCSV.writeNext(item);

или

    for(StacItem item : items){
        beanToCSV.write(item);
    }

    // to

    beanToCSV.write(items);

Привет, paranaaan, Да, я уже пробовал: writeNext не существует как метод «StatefulBeanToCsv», в то время как второе решение, к сожалению, записывает только один элемент... Я обнаружил, что «@CsvBindAndSplitByName(elementType = Number.class, writeDelimiter = "," )" делает свое дело, но недостатком является то, что он экспортирует только поле bbox для всех элементов!

Unearthly 12.05.2022 12:02
Ответ принят как подходящий

Попробуйте использовать CsvBindByName для каждого поля, которое вы хотите сопоставить (указывать атрибут column аннотации не обязательно).

Вы даже можете использовать CsvBindByPosition, если хотите.

Спасибо Таз! Это сработало как шарм, я использовал @CsvBindByName во всех остальных полях, кроме сложного.

Unearthly 12.05.2022 12:47

Другие вопросы по теме