С supercsv я могу применять минимальные и максимальные ограничения для длинного столбца с помощью LMinMax(), но как я могу это сделать с столбцом, который сопоставляет целое число? Если я использую LMinMax в столбце, который сопоставляет целое число в моем компоненте, когда я пытаюсь прочитать файл, я получаю исключение org.supercsv.exception.SuperCsvReflectionException, потому что он ищет сеттер, который занимает длинное, а не целое число.Super CSV: Поиск целочисленного эквивалента LMinMax
ответ
Единственная комбинация процессора ячейка, которая будет работать что-то вроде
new LMinMax(0, 10, new FmtNumber("###", new ParseInt()))
которое попало.
Проблема заключается в том, что Super CSV ReflectionUtils
допускает только точные соответствия по типу (поддерживается автобоксинг). Вы можете поднять запрос функции на Github, чтобы получить это исправление.
Вы можете обойти это с помощью CsvDozerBeanReader
(Dozer поддерживает отображение от Long
до Integer
довольно счастливо), или вы можете определить свой собственный процессор ячеек, как показано ниже.
public class IntMinMax extends LMinMax {
public IntMinMax(int min, int max) {
super(min, max);
}
@Override
public Object execute(Object value, CsvContext context) {
Long result = (Long) super.execute(value, context);
return result.intValue();
}
}
Это должно работать, но учтите, что это не позволяет процессоры быть прикован после него (вызов super.execute()
повторно/максимального проверки мин, но также означает, что вы не можете остановить его прохождение Long
к следующий процессор, поэтому я просто отключил цепочку).
Большое спасибо. Я использую пользовательский процессор ячеек, который вы предоставили, и он работает хорошо. –
Это может быть взлом - но вы всегда можете добавить параметр setter wth 'long' и внутри него, придать параметр' int' и вызвать ваш обычный 'int' setter. –