Spring Batch-如何将字符串从文件转换为日期?

我正在尝试处理其中某些字段为格式日期的CSV文件"yyyy-MM-

dd"-但当读者尝试将String从CSV文件转换为我的模型类中的Date时,阅读器失败。

错误是:

org.springframework.validation.BindException:org.springframework.validation.BeanPropertyBindingResult:1错误字段’datetimeInactive’中的对象’target’中的字段错误:拒绝的值[2011-04-27];

代码[typeMismatch.target.datetimeInactive,typeMismatch.datetimeInactive,typeMismatch.java.util.Date,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:代码[target.datetimeInactive,datetimeInactive];

参数[];

默认消息[datetimeInactive];默认消息[未能将属性’datetimeInactive’的’java.lang.String’类型的属性值转换为所需的’java.util.Date’类型;嵌套的异常是java.lang.IllegalStateException:无法将[java.lang.String]类型的值转换为所需的[java.util。类型。

读者的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:

  <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在上下文中定义了一个-为什么Spring不能将String转换为Date?

  2. 我已经读到Spring 3(Converter?)中有一种更新的方法可以完成转换。即http://forum.springsource.org/showthread.php?108480-Register-TypeConverter-PropertyEditor-w-Spring-Batch-但是,我在Spring Batch文档中找不到任何示例代码。您能在这里展示如何做/为我指出一些链接吗?

我对问题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。从这个论坛线程来看,我的代码似乎应该执行了转换。

堆栈跟踪为:

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

回答:

您的论坛参考用于在构建应用程序上下文和配置Bean时进行类型转换

看看BeanWrapperFieldSetMapper的JavaDoc

为了自定义将FieldSet值转换为所需类型以注入原型的方式,有几种选择。您可以 * 属性 *

,或者可以重写createBinder(Object)和initBinder(DataBinder)方法,或者可以提供自定义FieldSet实现。

意味着您应该将CustomDateEditor直接注入Mapper中

以上是 Spring Batch-如何将字符串从文件转换为日期? 的全部内容, 来源链接: utcz.com/qa/408563.html

回到顶部