2012-01-30 2 views
4

Я пытаюсь обрабатывать CSV-файл, в котором некоторые из полей являются датами формата "yyyy-MM-dd", но сбой читателя, когда он пытается преобразовать String из файла CSV в Date в моем классе модели.Spring Batch - как преобразовать String из файла в Date?

Ошибка:

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: коды [target.datetimeInactive, datetimeInactive]; аргументы []; сообщение по умолчанию [datetimeInactive]]; сообщение по умолчанию [Failed to преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'java.util.Date' для свойства 'datetimeInactive'; вложенное исключение 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. Я прочитал, что есть весомый путь весной 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. I.e., после установки преобразователя, я все еще получаю 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 в нужный тип для ввода в прототип, существует несколько вариантов. Вы можете впрыснуть экземпляры PropertyEditor непосредственно через customEditors * свойство *, или вы можете переопределить createBinder (Object) и initBinder методы (DataBinder), или вы можете предоставить собственный Fieldset реализации.

означает, что вы должны вводить свой CustomDateEditor непосредственно в Mapper

+0

Спасибо - теперь это ясно. Я просто хотел добавить, что если сопоставление не является точным клоном от «FieldSet» к объекту модели, вместо этого я должен использовать расширение «FieldSetMapper ». – rapt

+0

Если вы используете BeanWrapperFieldSetMapper до Spring Batch 2.20 (я не использовал его, поскольку они интегрировали Spring 3), вы можете заставить его уважать услугу преобразования путем подкласса BeanWrapperFieldSetMapper и вместо этого использовать подкласс, введя службу преобразования в подкласса и initBinder, вы можете затем установить службу преобразования в DataBinder с помощью setConversionService(). Это позволяет использовать хорошую поддержку Formatter/Converter (включая интегрированную с Spring версию форматирования времени). – MetroidFan2002