У меня есть следующее поле внутри объекта 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, я использую Try-With-Resources, так что это происходит автоматически
Но я не вижу никаких попыток с ресурсами в вашем методе выше. Возможно, вы закрываете его после, вы читаете файл и передаете его обратно в свой API. Тогда вы не читаете полное содержимое файла, потому что то, что вы только что написали, еще не было сброшено.
Спасибо за ваш ответ k3, я не думал об этом, к сожалению, смещение возврата после закрытия попытки с ресурсами не изменило результат. (Это не видно в приведенном выше коде, потому что я просто показываю соответствующий фрагмент)
Вы пробовали измениться?
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 для всех элементов!
Попробуйте использовать CsvBindByName
для каждого поля, которое вы хотите сопоставить (указывать атрибут column
аннотации не обязательно).
Вы даже можете использовать CsvBindByPosition
, если хотите.
Спасибо Таз! Это сработало как шарм, я использовал @CsvBindByName во всех остальных полях, кроме сложного.
Куда вы смываете или закрываете свой писатель?