2016-08-25 64 views
1

我正在使用OpenCSV庫的3.8版本。我使用註釋將bean字段映射到CSV文件中的列。我有它的工作到一定程度。當日期欄位爲空白時失敗。OpenCSV未映射JavaBeans與註釋

java.lang.RuntimeException: Error parsing CSV line: 1 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

**Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException** 
at com.opencsv.bean.BeanFieldDate.convertLocaleInspecific(BeanFieldDate.java:216) 
at com.opencsv.bean.BeanFieldDate.convert(BeanFieldDate.java:242) 
at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:70) 
at com.opencsv.bean.CsvToBean.processField(CsvToBean.java:245) 
at com.opencsv.bean.CsvToBean.processLine(CsvToBean.java:220) 
at com.opencsv.bean.CsvToBean.processLine(CsvToBean.java:189) 
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:166) 
... 26 more 
**Caused by: org.apache.commons.beanutils.ConversionException: No value specified for 'Date' 
at** org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:327) 
at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:327) 
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169) 
at com.opencsv.bean.BeanFieldDate.convertLocaleInspecific(BeanFieldDate.java:214) 
... 32 more 

特定bean字段的註解爲「required = false」,但它仍然不起作用。下面是JavaBean的註解,我現在用的是Java.Util.Date類:

@CsvBindByName(column="Sent On", required=true) 
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z") 
private Date sentOn; 

@CsvBindByName(column="Last Activity", required=false) 
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z") 
private Date lastActivity; 

@CsvBindByName(column="Completed On", required=false) 
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z") 
private Date completedOn; 

這是怎麼了,我創建了一個CSV閱讀器和分析器:

final char QUOTE_CHARACTER = '"'; 
    ClassLoader classLoader = getClass().getClassLoader(); 
    File newFile = new File(classLoader.getResource(fileName).getFile()); 
    CSVReader reader2 = null; 

    FileReader fileReader2 = null; 

    List<My_Data> myList = null; 

    try { 

     HeaderColumnNameMappingStrategy<My_Data> strat = new HeaderColumnNameMappingStrategy<My_Data>(); 
     strat.setType(My_Data.class); 

     CsvToBean<My_Data> csv = new CsvToBean<>(); 

     final CSVParser csvParser = new CSVParserBuilder().withSeparator(delimiter) 
                  .withQuoteChar(QUOTE_CHARACTER) 
                  .withStrictQuotes(true) 
                  .build(); 

     fileReader2 = new FileReader(newFile); 

     reader2 = new CSVReaderBuilder(fileReader2).withCSVParser(csvParser) 
                .withVerifyReader(true) 
                .withKeepCarriageReturn(false) 
                .build(); 


     myList = csv.parse(strat, reader2); 

下面是CSV文件中的數據:

"Subject","Status","Sender Name","Recipient","Sent On","Last Activity","Completed On","Completion Time (DD:HH:MM)","Created Date","Declined Date","Document ID","Reason for Declining","Expiration Date","Date Signed" 
"MyCompany: Plan RCP Endorsements Select Bundle","Sent","ENV_PROD","SANDRA BULLOCK","7/21/2016 10:49:38 AM EST","7/21/2016 10:49:38 AM EST","","","7/21/2016 10:49:37 AM EST","","e05e53d8-e8bd-469e-a774-c0dec98481b2","","9/4/2016 10:49:38 AM EST","" 

我是如何發現這個故障是通過源代碼的。我希望別人也面臨類似的問題,可以給我一個關於如何解決這個問題的建議。我喜歡這種映射方法,因爲它節省了我的時間和精力。該過程通過將文件讀入列表來工作。這種方法的問題是我必須爲JavaBean編寫工廠過程。

歡迎提出意見。

感謝,

拉斯

+0

失敗,例外?或者因未按預期工作而失敗。 – Compass

+0

你忽略了標題嗎?它似乎錯誤第1行,即標題 – Saravana

+0

謝謝你的建議。當我跳過第一行時,映射器無法根據列找到bean字段。會發生什麼是JavaBean創建,但沒有填充字段。 – rray

回答

0

我們確定你所看到作爲opencsv代碼問題的問題。貢獻者正在重寫3.9版本的日期處理代碼,因此我們將確保代碼修復您的問題。

我們沒有爲3.9版本的日期,所以如果你需要立即的東西,你必須或可以建立代碼自己去的BeanFieldDate類,並在轉換方法並替換:

if (required && StringUtils.isEmpty(value)) { 
     throw new CsvRequiredFieldEmptyException(); 
    } 

與像

if (required && StringUtils.isEmpty(value)) { 
     if (required) { 
      throw new CsvRequiredFieldEmptyException(); 
     } else { 
      return null; // or maybe empty string 
     } 
    } 

看看是否會有所幫助。

+0

斯科特,感謝您的建議。我下載了源代碼並嘗試了兩者。它不起作用。 :-(出於同樣的原因,它仍然在相同的數據點上失敗。 – rray