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

时间:2016-10-03 15:14:29

标签: java date tostring classcastexception 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());
        }       
    }
}

但在使用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.TrimConversion以及parser.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对象上应用正确的日期格式时,打印正确显示预期结果。

1 个答案:

答案 0 :(得分:2)

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

onCreate()

这会生成一个Conversions.toDate("dd-MM-yyyy"), Conversions.trim() 对象,然后在日期而不是Date之上应用String.trim()操作,这会导致您刚刚收到的错误。

如果你改变了订单,这应该有效:

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; } 注释,除非您在设置中禁用修剪。

希望这有帮助。