Spring batch Spring批处理:具有BigDecimal格式的passthroughFieldDextractor

Spring batch Spring批处理:具有BigDecimal格式的passthroughFieldDextractor,spring-batch,bigdecimal,Spring Batch,Bigdecimal,我使用SpringBatch从一个混合了列类型的DB表中提取CSV文件。示例表SQL模式为 [product] [varchar](16) NOT NULL, [version] [varchar](16) NOT NULL, [life_1_dob] [date] NOT NULL, [first_itm_ratio] [decimal](9,6) NOT NULL, “first_itm_ration”字段的示例数据库列值为 first_itm_ratio 1.050750 0.92000

我使用SpringBatch从一个混合了列类型的DB表中提取CSV文件。示例表SQL模式为

[product] [varchar](16) NOT NULL,
[version] [varchar](16) NOT NULL,
[life_1_dob] [date] NOT NULL,
[first_itm_ratio] [decimal](9,6) NOT NULL,
“first_itm_ration”字段的示例数据库列值为

first_itm_ratio
1.050750
0.920000
但我希望我的CSV从值中删除尾随的零

first_itm_ratio
1.05075
0.92
我不希望为表中的每个特定字段定义格式,而是为该数据类型的所有列定义一个全局对象特定格式

我的csvFileWriter bean

<bean id="csvFileWriter"      class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <property name="resource" ref="fileResource"/>
    <property name="lineAggregator">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <property name="delimiter">
                <util:constant static-field="org.springframework.batch.item.file.transform.DelimitedLineTokenizer.DELIMITER_COMMA"/>
            </property>
            <property name="fieldExtractor">
                <bean class="org.springframework.batch.item.file.transform.PassThroughFieldExtractor" />
            </property>
        </bean>
    </property>
</bean>

您可以

  • 编写自己的
    BigDecimalToStringConverter实现转换器
    以格式化大十进制,而不尾随0
  • 创建新的
    ConversionService
    MyConversionService
    )并注册到自定义转换器中
  • 扩展
    DelimitedLineAggregator
    ,注入
    MyConversionService
    ,覆盖
    doAggregate()
    以使用注入转换服务格式化字段


  • 公共类MyFieldLineAggregator扩展DelimitedLineAggregator{
    private ConversionService cs=新的MyConversionService();
    公共字符串doAggregate(对象[]字段){
    for(int i=0;i
    public class MyConversionService extends DefaultConversionService {
      public MyConversionService() {
        super();
        addConverter(new BigDecimalToStringConverter());
      }
    }
    
    public class MyFieldLineAggregator<T> extends DelimitedLineAggregator<T> {
      private ConversionService cs = new MyConversionService();
    
      public String doAggregate(Object[] fields) {
        for(int i = 0;i < fields.length;i++) {
          final Object o = fields[i];
          if(cs.canConvert(o.getClass(), String.class)) {
            fields[i] = cs.convert(o, String.class);
          }
        }
        return super.doAggregate(fields);
      }
    }