次のSpringバッチジョブを読み、 ”

domain.csv

“からデータを読み取り、それをドメインオブジェクトにマップします。

job-example.xml

<bean class="org.springframework.batch.item.file.FlatFileItemReader" >

  <property name="resource" value="file:outputs/csv/domain.csv"/>
  <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">

    <property name="lineTokenizer">
      <bean
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
        <property name="names" value="id, domainName, lastModifiedDate"/>
      </bean>
    </property>
    <property name="fieldSetMapper">
      <bean
        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
        <property name="prototypeBeanName" value="domain"/>
      </bean>
    </property>

    </bean>
  </property>

</bean>

 <bean id="domain" class="com.mkyong.batch.Domain" scope="prototype"/>

domain.csv

1,facebook.com,Mon Jul 15 16:32:21 MYT 2013
2,google.com,Mon Jul 15 16:32:21 MYT 2013
3,youtube.com,Mon Jul 15 16:32:21 MYT 2013
4,yahoo.com,Mon Jul 15 16:32:21 MYT 2013
5,amazon.com,Mon Jul 15 16:32:21 MYT 2013

Domain.java

import java.util.Date;

public class DomainRanking {

    private int id;
    private String domainName;
    private Date lastModifiedDate;

   //...
}

問題

問題は、String Date `Mon Jul 15 16:32:21 MYT 2013`をjava.util.Dateにマップ/変換する方法です。上記のジョブを実行すると、次のエラーメッセージが表示されます。

Cannot convert value of type[java.lang.String]to required type[java.util.Date]
        for property 'lastModifiedDate':
    no matching editors or conversion strategy found

解決策


BeanWrapperFieldSetMapper JavaDoc

を参照してください。

To customize the way that FieldSet values are converted to the desired
type for injecting into the prototype there are several choices. You can
inject PropertyEditor instances directly through the customEditors
property…​

それを修正するために、

CustomDateEditor`を宣言し、

customEditors`プロパティを介して `BeanWrapperFieldSetMapper`に注入します。

job-example.xml

<bean id="dateEditor"
  class="org.springframework.beans.propertyeditors.CustomDateEditor">
  <constructor-arg>
    <bean class="java.text.SimpleDateFormat">
              <constructor-arg value="EEE MMM dd HH:mm:ss z yyyy"/>
    </bean>
  </constructor-arg>
  <constructor-arg value="true"/>
</bean>

<bean class="org.springframework.batch.item.file.FlatFileItemReader" >

  <property name="resource" value="file:outputs/csv/domain.csv"/>
  <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
    <property name="lineTokenizer">
      <bean
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
        <property name="names" value="id, domainName, lastModifiedDate"/>
      </bean>
    </property>
    <property name="fieldSetMapper">
      <bean
        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
        <property name="prototypeBeanName" value="domain"/>
        <property name="customEditors">
          <map>
            <entry key="java.util.Date">
                 <ref local="dateEditor"/>
            </entry>
          </map>
        </property>
      </bean>
    </property>

    </bean>
  </property>
</bean>

<bean id="domain" class="com.mkyong.batch.Domain" scope="prototype"/>

__P.S String Date “Mon Jul 15 16:32:21 MYT 2013″は “EEE MMM dd HH:mm:ss z yyyy”で表されます。

    <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. バグ:

日付のために働いていない]。

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

[java.text.SimpleDateFormat

バッチ – 文字列をファイルから日付に変換する方法]。リンク://spring/spring-how-to-be-bean-property-customdateeditor/[Spring

ビーンプロパティに日付を挿入する – CustomDateEditor]。 link://java/how-to-convert-string-to-date-java/[文字列を変換する方法

今日まで – Java]