java.lang.ClassCastException:使用 Univocity 时无法将 java.util.Date 转换为 java.lang.String

java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String when using Univocity

我正在尝试读取 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());
        }       
    }
}

但是在用 parser.parseLine(line);

解析行时,我得到以下异常 Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.Stringcom.univocity.parsers.common.DataProcessingException: Error converting value 'Sat Apr 12 00:00:00 CEST 1986' using conversion com.univocity.parsers.conversions.TrimConversion 的附加信息

我正在尝试将日期表示为行中的日期,例如“12-04-1986”,我尝试提供转换 "dd-MM-yyyy",不幸的是没有用。

我的代码中缺少什么以获得 "Birthday: 12-04-1986" 的预期系统?

编辑:使用java.util.Date

此人class:

// 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
}

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

第一期是您定义的转换顺序:

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

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

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

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

但是,您的 Person class 的 birthDate 字段必须用 @Parsed 注释,否则您将得到 null.

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

public class Person{
    @Parsed
    String id;

    @Parsed
    String name;

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

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

希望对您有所帮助。