2015-05-28 1 views
1

С supercsv я могу применять минимальные и максимальные ограничения для длинного столбца с помощью LMinMax(), но как я могу это сделать с столбцом, который сопоставляет целое число? Если я использую LMinMax в столбце, который сопоставляет целое число в моем компоненте, когда я пытаюсь прочитать файл, я получаю исключение org.supercsv.exception.SuperCsvReflectionException, потому что он ищет сеттер, который занимает длинное, а не целое число.Super CSV: Поиск целочисленного эквивалента LMinMax

+0

Это может быть взлом - но вы всегда можете добавить параметр setter wth 'long' и внутри него, придать параметр' int' и вызвать ваш обычный 'int' setter. –

ответ

0

Единственная комбинация процессора ячейка, которая будет работать что-то вроде

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 к следующий процессор, поэтому я просто отключил цепочку).

+0

Большое спасибо. Я использую пользовательский процессор ячеек, который вы предоставили, и он работает хорошо. –