我試圖處理一個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讀者:
在我的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>
個
我的問題是:
我已經定義在我的背景下
CustomDateEditor
- 那麼,爲什麼不能轉換春天字符串成日期?我讀過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
謝謝 - 它現在是明確的。我只想補充說,如果映射不是從FieldSet到模型對象的確切克隆,那麼我應該使用「FieldSetMapper」的擴展。 –
rapt
2012-02-02 14:14:38
如果您在Spring Batch 2.20之前使用BeanWrapperFieldSetMapper(自從他們集成了Spring 3以來我沒有使用它),您可以通過繼承BeanWrapperFieldSetMapper並使用子類來使其尊重轉換服務,將轉換服務注入到子類和initBinder,然後可以通過setConversionService()將轉換服務設置到DataBinder中。這允許很好的Formatter/Converter支持(包括Spring提供的Joda時間格式集成)。 – MetroidFan2002 2013-07-12 19:56:19