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.String
和 com.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在设置中。
希望对您有所帮助。
我正在尝试读取 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.String
和 com.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在设置中。
希望对您有所帮助。