2012-01-30 20 views
4

我試圖處理一個CSV文件,其中一些字段是格式爲"yyyy-MM-dd"的日期 - 但是當讀取器嘗試將字符串從CSV文件轉換爲我的模型類中的日期時失敗。Spring批處理 - 如何將字符串從文件轉換爲日期?

錯誤是:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult:1個錯誤 字段錯誤在對象 '目標' 上字段 'datetimeInactive':拒絕 值[2011-04-27];代碼 [typeMismatch.target.datetimeInactive,typeMismatch.datetimeInactive,typeMismatch.java.util.Date,typeMismatch]; 參數 [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.datetimeInactive,datetimeInactive];參數[]; 默認消息[datetimeInactive]];默認消息[未能 將'java.lang.String'類型的屬性值轉換爲屬性'datetimeInactive'所需的類型 'java.util.Date';嵌套的異常是 java.lang.IllegalStateException:不能 類型的值轉換[java.lang.String中]至所需的類型[java.util.Date用於屬性 「datetimeInactive」:沒有匹配的編輯器或轉換策略發現]

XML讀者:

http://code.google.com/p/springbatch-in-action/source/browse/trunk/sbia/ch07/src/test/resources/com/manning/sbia/ch07/test-batch-reader-context.xml?r=145

在我的XML配置文件,我有以下豆:

<bean id="dateEditor" class="org.springframework.beans.propertyeditors.CustomDateEditor"> 
    <constructor-arg> 
     <bean class="java.text.SimpleDateFormat"> 
     <constructor-arg value="yyyy-MM-dd" /> 
     </bean> 
    </constructor-arg> 
    <constructor-arg value="true" /> 
    </bean> 

    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
    <property name="customEditors"> 
     <map> 
     <entry key="java.util.Date"> 
      <ref local="dateEditor" /> 
     </entry> 
     </map> 
    </property> 
    </bean> 

我的問題是:

  1. 我已經定義在我的背景下CustomDateEditor - 那麼,爲什麼不能轉換春天字符串成日期?

  2. 我讀過Spring 3中有一個更新的方法(Converter?)來完成轉換。即http://forum.springsource.org/showthread.php?108480-Register-TypeConverter-PropertyEditor-w-Spring-Batch - 但是,我在Spring Batch文檔中找不到任何示例代碼。你可以在這裏展示如何做到這一點/指出我的一些鏈接?

UPDATE:

我得到的回答問題#2:

XML:

<mvc:annotation-driven conversion-service="conversionService" /> 

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="my.project.StringToDate"> 
       <!-- org.springframework.binding.convert.converters.StringToDate DEFAULT_PATTERN = "yyyy-MM-dd" --> 
       <property name="pattern" value="yyyy-MM-dd" /> 
      </bean> 
     </set> 
    </property> 
    </bean> 

自定義轉換器:

package my.project; 

import java.util.Date; 

import org.springframework.core.convert.converter.Converter; 

public class StringToDate extends org.springframework.binding.convert.converters.StringToDate implements Converter<String, Date> { 

    public Date convert(String source) { 

     Date date = null; 

     try { 
      date = (Date) convertSourceToTargetClass(getPattern(), getTargetClass()); 
     } catch (Exception e) { 

     } 

     return date; 
    } 

} 

我仍在尋找問題#1的答案。也就是說,在設置轉換器之後,我仍然在批處理任務期間收到BindException。從this forum thread,它看起來像我的代碼應該執行轉換。

堆棧跟蹤是:

Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors 
Field error in object 'target' on field 'datetimeInactive': rejected value [2011-04-27]; codes [typeMismatch.target.datetimeInactive,typeMismatch.datetimeInactive,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.datetimeInactive,datetimeInactive]; arguments []; default message [datetimeInactive]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'datetimeInactive'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'datetimeInactive': no matching editors or conversion strategy found] 
Field error in object 'target' on field 'datetimeActive': rejected value [2011-04-27]; codes [typeMismatch.target.datetimeActive,typeMismatch.datetimeActive,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.datetimeActive,datetimeActive]; arguments []; default message [datetimeActive]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'datetimeActive'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'datetimeActive': no matching editors or conversion strategy found] 
    at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.mapFieldSet(BeanWrapperFieldSetMapper.java:186) 
    at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:42) 
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:179) 
    ... 45 more 

回答

3

您的論壇引用進行類型轉換而構建的應用程序上下文和配置豆類

看一看的JavaDoc爲BeanWrapperFieldSetMapper

要定製FieldSet值轉換爲想要注入原型的所需 類型的方式,有幾種選擇。您可以 通過的customEditors * 財產 *直接注入屬性編輯器的情況下,也可以覆蓋createBinder(對象)和 initBinder(DataBinder的)方法,或者你可以提供自定義FieldSet中 實現。

這意味着你應該直接注入你和CustomDateEditor到映射

+0

謝謝 - 它現在是明確的。我只想補充說,如果映射不是從FieldSet到模型對象的確切克隆,那麼我應該使用「FieldSetMapper 」的擴展。 – rapt 2012-02-02 14:14:38

+0

如果您在Spring Batch 2.20之前使用BeanWrapperFieldSetMapper(自從他們集成了Spring 3以來我沒有使用它),您可以通過繼承BeanWrapperFieldSetMapper並使用子類來使其尊重轉換服務,將轉換服務注入到子類和initBinder,然後可以通過setConversionService()將轉換服務設置到DataBinder中。這允許很好的Formatter/Converter支持(包括Spring提供的Joda時間格式集成)。 – MetroidFan2002 2013-07-12 19:56:19