4

我对春季批次很陌生。我有一个要求,我必须读取具有标题(字段名称)记录和数据记录的文件

  1. 我必须验证第一条记录(检查与一组预定义名称匹配的字段名称)-请注意,需要跳过此记录-我的意思是不应该是处理器中项目的一部分)

  2. 读取其余字段值并将其存储到 POJO

  3. 如果“日期”字段为空,我需要将默认值设置为“xxxx-yy-zz”

我无法使用批处理的第一个和第三个要求是示例阅读器 XML。请帮忙

 <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader">
     <property name="resource" value="classpath:input/import" /> 
     <property name="encoding" value="UTF-8" />
    <property name="linesToSkip" value="1" />
    <property name="lineMapper" ref="line.mapper"/>
 </bean>

 <bean id="line.mapper" class="org.springframework.batch.item.file.mapping .DefaultLineMapper">
    <property name="lineTokenizer" ref="line.tokenizer"/>
    <property name="fieldSetMapper" ref="fieldSet.enity.mapper"/>
 </bean>

 <bean id="line.tokenizer" class="org.springframework.batch.item.file.transfo  rm.DelimitedLineTokenizer">
     <property name="delimiter">
       <util:constant static-field="org.springframework.batch.item.file.transfo rm.DelimitedLineTokenizer.DELIMITER_TAB"/>
     </property>
     <property name="names" value="id,date,age " />
     <property name="strict" value="false"/>
</bean>

  <bean id="fieldSet.enity.mapper" class="org.springframework.batch.item.file.mapping .BeanWrapperFieldSetMapper">
      <property name="targetType" value="a.b.myPOJO"/>
      <property name="customEditors">
           <map>
              <entry key="java.util.Date">
                     <bean class="org.springframework.beans.propertyeditors.C ustomDateEditor">
                           <constructor-arg>
                                <bean class="java.text.SimpleDateFormat">
                                         <constructor-arg value="yyyy-mm-dd" />
                                 </bean>
                           </constructor-arg>
                           <constructor-arg value="true" />
                     </bean>
               </entry>
          </map>
     </property>
4

2 回答 2

2

创建您自己的自定义 FieldSetMapper,如下所示

CustomeFieldSetMapper implements FieldSetMapper<a.b.myPOJO> {

@Override
public a.b.myPOJO mapFieldSet(FieldSet fs) {
           a.b.myPOJO  myPOJO = new a.b.myPOJO();
           if(fs.readString("date").isEmpty()){
               myPOJO.setDate("xxxx-yy-zz");
           }
           return a.b.myPOJO;
    } 
}
于 2013-04-17T07:39:57.867 回答
1

你认为你应该在ItemProcessor.

此外,如果<property name="linesToSkip" value="1" />不能满足您的要求 - 在其中手动扩展FlatFileItemReader和验证第一行。

于 2013-03-15T08:43:44.480 回答