Spring Batch - comment convertir une Chaîne de caractères à partir d'un fichier à Jour?
Je suis en train de traiter un fichier CSV dans lequel certains de ces champs sont des dates au format "yyyy-MM-dd"
- mais le lecteur ne parvient pas à convertir la Chaîne de caractères à partir du fichier CSV pour une Date dans ma classe de modèle.
L'erreur est:
org.springframework.la validation.BindException:
org.springframework.la validation.BeanPropertyBindingResult: 1 erreur
Champ d'erreur dans l'objet "cible" sur le champ, datetimeInactive': rejeté
valeur [2011-04-27]; codes
[typeMismatch.target.datetimeInactive,typeMismatch.datetimeInactive,typeMismatch.java.util.Date,typeMismatch];
arguments
[org.springframework.contexte.de soutien.DefaultMessageSourceResolvable:
codes [cible.datetimeInactive,datetimeInactive]; les arguments [];
message par défaut [datetimeInactive]]; défaut de message [impossible de
convertir la valeur de la propriété type " java.lang.Chaîne' de type
"java.util.Date " pour la propriété 'datetimeInactive'; nested exception est
java.lang.IllegalStateException: Impossible de convertir une valeur de type
[java.lang.String] de type [java.util.La Date] pour la propriété
'datetimeInactive": pas de correspondance des éditeurs ou à la conversion de la stratégie trouvé]
XML pour le lecteur:
Dans mon XML fichiers de config j'ai le texte suivant haricots:
<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>
Mes questions sont:
- J'ai défini un
CustomDateEditor
dans mon contexte - alors, pourquoi ne pas le Printemps convertir la Chaîne en Date? - J'ai lu qu'il y est une nouvelle façon de Printemps 3 (
Converter
?) pour obtenir la conversion terminée. c'est à dire http://forum.springsource.org/showthread.php?108480-Register-TypeConverter-PropertyEditor-w-Spring-Batch -- cependant, je ne pouvais pas trouver un exemple de code dans le Printemps de la documentation du Lot. Pourriez-vous montrer ici comment le faire /me diriger vers un lien?
Mise à JOUR:
J'ai une réponse à la question n ° 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>
Convertisseur Personnalisé:
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;
}
}
Je suis toujours à la recherche d'une réponse à la question n ° 1. I. e., après avoir défini le convertisseur, je suis encore en train BindException au cours de la tâche. De ce fil du forum, il semble que mon code doit avoir effectué la conversion.
Trace de la pile est:
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
OriginalL'auteur rapt | 2012-01-30
Vous devez vous connecter pour publier un commentaire.
votre forum de référence pour le type de conversion lors de la construction du contexte de l'application et de la configuration de la haricots
prendre un coup d'oeil à la JavaDoc de la BeanWrapperFieldSetMapper
ce qui signifie que vous devez injecter votre CustomDateEditor directement dans le Mappeur de
FieldSet
le Modèle de l'Objet alors que je devrais utiliser une extension deFieldSetMapper<ModelClass>
à la place.Si vous êtes à l'aide de la BeanWrapperFieldSetMapper avant de Spring Batch 2.20 (je ne l'ai pas utilisé depuis qu'ils ont intégré le Printemps 3), vous pouvez la faire respecter le service de conversion en sous-classement BeanWrapperFieldSetMapper et à l'aide de la sous-classe au lieu de cela, l'injection de la conversion de service dans la sous-classe et sur initBinder vous pouvez ensuite définir le service de conversion dans le DataBinder via setConversionService(). Cela permet à la belle Formateur/Convertisseur de soutien (y compris le Ressort fourni par Joda Temps de mise en forme de l'intégration).
OriginalL'auteur Michael Pralow