Spring Batch:读取文件:如果字段为空,则设置默认值。

4
我对Spring Batch非常陌生。我有一个需求,需要读取一个包含标题(字段名称)记录和数据记录的文件。
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>

如果第一行验证失败,应该发生什么?完全跳过文件吗? - Serkan Arıkuşu
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;
    } 
}

1
你认为应该在ItemProcessor中设置日期。

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


我计划使用另一个读取器来读取头部并验证格式,然后退出。因此,我为该读取器设置了<property name="linesToSkip" value="1"/>。如果这不是正确的方法,那么你是对的。我不应该跳过第一行。 - Tech User
设置日期时,我可以像这样做吗:<bean 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"/> <property name="value" value="0000-00-00"/> </bean> - Tech User
不理解你最后的评论。 - Michail Nikolaev
我想在日期字段为空时设置其值。那么我可以使用CustomEditors通过添加以下属性来实现吗?<property name="value" value="0000-00-00"/>它会被设置为默认值吗? - Tech User
只需实现自己的“ItemProcessor”并根据需要修改对象即可。 - Michail Nikolaev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接