1

我正在尝试读取 java.sql.Date 字段并使用 Univocity 将其解析为 java bean,代码如下:

public class Example {

    public static void main(final String[] args) throws FileNotFoundException {
        final BeanListProcessor<Person> rowProcessor = new BeanListProcessor<Person>(Person.class);

        final CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(rowProcessor);
        parserSettings.setHeaderExtractionEnabled(false);
        parserSettings.getFormat().setDelimiter('|');       

        final String line = "0|John|12-04-1986";
        final CsvParser parser = new CsvParser(parserSettings);
        parser.parseLine(line);

        final List<Person> beans = rowProcessor.getBeans();

        for (final Person person : beans) {
            // Expected print: Birthday: 12-04-1986
            System.out.println("Birthday: " + person.getBirthDate());
        }       
    }
}

但我收到以下异常以及解析行时的Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String其他信息com.univocity.parsers.common.DataProcessingException: Error converting value 'Sat Apr 12 00:00:00 CEST 1986' using conversion com.univocity.parsers.conversions.TrimConversionparser.parseLine(line);

我试图将日期表示为它在行中的样子,例如“12-04-1986”,我尝试提供转换“dd-MM-yyyy”,不幸的是无济于事。

我的代码中缺少什么来获得“生日:12-04-1986”的预期系统?

编辑:使用 java.util.Date

人物类:

// using the correct Date object!
import java.util.Date;

import com.univocity.parsers.annotations.Format;
import com.univocity.parsers.annotations.Parsed;

public class Person {

    @Parsed(index=0)
    private Integer id;

    @Parsed(index=1)
    private String name;

    @Parsed(index=2)
    @Format(formats = "dd-MM-yyyy")
    private Date birthDate;

    //getters and setters ommited
}

将 Date 对象更改为 java.util.Date 并在 java.util.Date 对象上应用正确的日期格式时,打印会正确显示预期结果。

4

1 回答 1

2

第一个问题是您定义的转换顺序:

Conversions.toDate("dd-MM-yyyy"), Conversions.trim()

这会生成一个Date对象,然后String.trim()在 date 而不是 a 之上应用操作String,这会导致您刚刚得到的错误。

如果您更改顺序,这应该有效:

Conversions.trim(), Conversions.toDate("dd-MM-yyyy")

但是,您的Person班级必须对其birthDate字段进行注释,@Parsed否则您将获得null.

@Format在您的字段上添加注释birthDate而不是应用该转换序列应该更容易。你可以像这样声明你的类:

public class Person{
    @Parsed
    String id;

    @Parsed
    String name;

    @Parsed
    @Format(formats = "dd-MM-yyyy") //notice that multiple formats are supported
    Date birthDate;
}

最后,请注意解析器默认修剪值,因此您不需要使用修剪转换或@Trim注释,除非您在设置中禁用修剪。

希望这可以帮助。

于 2016-10-04T08:29:08.870 回答