2016-10-03 55 views
1

我正在嘗試使用Univocity讀取java.sql.Date字段並將其解析爲java bean代碼:java.lang.ClassCastException:使用Univocity時,java.util.Date不能轉換爲java.lang.String

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」,遺憾的是無濟於事。

我在代碼中錯過了什麼以獲得期望的「生日:12-04-1986」系統?

編輯:使用java.util.Date

Person類:

// 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對象的打印正確顯示預期的結果。

回答

2

第一個問題是你定義的轉換序列:

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

這會產生一個Date對象,然後在一個日期,而不是一個String,這會導致你只是得到了錯誤的信息適用一個String.trim()操作。

如果您更改順序可以這樣:

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

但是,你Person類必須有其birthDate場標註有@Parsed,否則你會得到一個null

只需在birthDate字段中添加@Format註釋而不是應用該轉換序列應該會更容易。你可以只聲明類是這樣的:

public class Person{ 
    @Parsed 
    String id; 

    @Parsed 
    String name; 

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

最後,通知解析器,所以你不需要,除非你禁用設置微調使用微調轉換或@Trim註釋修剪默認值。

希望這會有所幫助。

+0

'應該更容易在您的birthDate上添加@Format註釋,正是我希望能夠呈現的功能。我在github的手冊中找不到它,但是這個特性使日期解析更加容易,因爲解析的實際文件有很多日期對象,而且其中一些有不同的格式。現在我知道該找什麼了,我也找到了'AnotherTestBean.java'的例子。感謝您的解釋和幫助! –

相關問題