Spring Batch - como converter String de arquivo para Dat
Estou tentando processar um arquivo CSV no qual alguns dos campos são datas do formato"yyyy-MM-dd"
- mas o leitor falha ao tentar converter a String do arquivo CSV em uma Data na minha classe de model
O erro é:
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 erro Erro de campo no objeto 'target' no campo 'datetimeInactive': valor rejeitado [2011-04-27]; códigos [typeMismatch.target.datetimeInactive, typeMismatch.datetimeInactive, typeMismatch.java.util.Date, typeMismatch]; argumentos [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.datetimeInactive, datetimeInactive]; argumentos []; mensagem padrão [datetimeInactive]]; mensagem padrão [Falha ao converter o valor da propriedade do tipo 'java.lang.String' para o tipo obrigatório 'java.util.Date' para a propriedade 'datetimeInactive'; a exceção aninhada é java.lang.IllegalStateException: não é possível converter o valor do tipo [java.lang.String] no tipo obrigatório [java.util.Date] para a propriedade 'datetimeInactive': nenhum editor ou estratégia de conversão encontrado]
XML para o leitor:
Nos meus arquivos de configuração XML, tenho os seguintes beans:
<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>
As minhas perguntas são:
Eu defini umCustomDateEditor
no meu contexto - então, por que o Spring não pode converter a String em Dat
Li que há uma maneira mais nova na primavera 3 Converter
?) para concluir a conversão. i.e.http: //forum.springsource.org/showthread.php? 108480-Register-TypeConverter-PropertyEditor-w-Spring-Batch - no entanto, não encontrei nenhum código de exemplo para isso na documentação do Spring Batch. Você poderia mostrar aqui como fazer isso / me indicar um link?
ATUALIZAR
Eu tenho uma resposta para a pergunta 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>
Custom Converter:
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;
}
}
Ainda estou procurando uma resposta para a pergunta nº 1. Ou seja, depois de configurar o conversor, ainda recebo o BindException durante a tarefa em lote. A partir de esta discussão no fórum, parece que meu código deveria ter realizado a conversão.
rastreio do @Stack é:
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