org.supercsv.exception.SuperCsvCellProcessorException: входное значение должно иметь тип java.lang.String, но java.util.Date

Я использую SuperCsv для анализа файла csv в Javabeans, который затем сохраняю в таблице БД. Я получаю следующее исключение при попытке ввести столбец даты. После прочтения superscv API и документации я действительно не могу понять, как правильно записать csv в Javabean и сохранить его в базе данных. Исключение:

org.supercsv.exception.SuperCsvCellProcessorException: the input value should be of     type java.lang.String but is java.util.Date processor=org.supercsv.cellprocessor.ParseDate context={lineNo=2, rowNo=2, columnNo=3, rowSource=[moredata, 450, Thu Jan 01 00:09:00 PST 2015]}

CSV-файл:

someData,23,01/09/2015
moredata,450,01/09/2015
evenMoreData,500,01/09/2015

Я разбираю CSV следующим образом:

private List<Timeseries> readCSVToBean() throws IOException {
    ICsvBeanReader beanReader = null;

    List<Timeseries> timeSeries = new ArrayList<Timeseries>();
    try {
        beanReader = new CsvBeanReader(new FileReader(pathName),
                CsvPreference.STANDARD_PREFERENCE);

        // the name mapping provide the basis for bean setters 
        final String[] nameMapping = new String[]{"varval", "actualNum", "daterec"};
        //just read the header, so that it don't get mapped to Timeseries object
        final String[] header = beanReader.getHeader(false);
        final CellProcessor[] processors = getProcessors();

        Timeseries timeEntity;

        while ((timeEntity = beanReader.read(Timeseries.class, nameMapping,
                processors)) != null) {
            timeSeries.add(timeEntity);
        }

    } finally {
        if (beanReader != null) {
            beanReader.close();
        }
    }
    return timeSeries;
}

private static CellProcessor[] getProcessors() {

    final CellProcessor[] processors = new CellProcessor[]{
        new NotNull(), // varval
        new ParseInt(), // actualNum
        //new FmtDate("dd/MM/yyyy") 
        new ParseDate("dd/mm/yyyy") // Daterec
    };
    return processors;
}

Компонент Timeseries:

public class Timeseries implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer timid;
    private String varval;
    private Integer actualnum;
    private Date daterec;

    // ...
}

person jay tai    schedule 10.01.2015    source источник


Ответы (1)


Как указано на веб-сайте, ParseDate используется для чтения (String -> Date) и FmtDate используется для записи (Date -> String).

Вам понадобится один набор процессоров для чтения и другой для записи.

person James Bassett    schedule 10.01.2015