Spring批处理:使用FieldSetMapper时,默认为空字段(double和char)的值

时间:2016-03-10 07:14:40

标签: java spring spring-batch default-value

我目前正在使用Spring批处理来读取文件。我的文件中的某些列可能具有空值。例如,我的文件中的行可能如下所示:

110045,,,50000

此处,第2列和第3列具有空值。第2列将映射到double,第3列将映射到我的域对象中的char。 FieldSetMapper将按如下方式实施:

public class MyFieldSetMapper implements FieldSetMapper<SomeDomain> {

    public SomeDomain mapFieldSet(FieldSet fs) {
        final SomeDomain someDomain = new SomeDomain();
        someDomain.setAmount(fs.readDouble(1));
        someDomain.setIndividualFlag(fs.readChar(2));
        someDomain.setBalance(fs.readInt(3,0));
        return someDomain;
    }
}

上面的FieldSetMapper实现将在运行时导致异常,因为空String不能被赋予双精度或字符。

虽然FieldSet包含readBigDecimal(int,BigDecimal)readInt(int,int)等方法,但如果字符串无法解析为特定类型,则可以指定默认值不为chardouble提供类似的方法。我不确定将chardouble类型的默认选项退出后的动机是什么。

我需要的是一种在每个char字段中为doubleFieldSetMapper数据类型提供默认值的方法。也就是说,我不想为默认的chardouble数据类型定义全局策略,但我希望能够像我一样默认这些类型默认为intBigDecimal

我想过使用FieldSetFactory来插入扩展FieldSet的自定义DefaultFieldSet实现,并提供另外两种方法,即readDouble(int,double)readChar(int,char)

public class CustomFieldSet extends DefaultFieldSet {

    public CustomFieldSet(String[] tokens, String[] names) {
        super(tokens, names);
    }

    public CustomFieldSet(String[] tokens) {
        super(tokens);
    }

    public char readChar(int index, char defaultValue) {
        String value = readAndTrim(index);
        return StringUtils.hasLength(value) ? value.charAt(0) : defaultValue;
    }

    public int readChar(String name, char defaultValue) {
        return readChar(indexOf(name), defaultValue);
    }
}

然后,我可以将FieldSet方法的mapFieldSet参数转换为CustomFieldSet实现

public class MyFieldSetMapper implements FieldSetMapper<SomeDomain> {

  public SomeDomain mapFieldSet(FieldSet fs) {
       CustomFieldSet cs = (CustomFieldSet)fs;
       final SomeDomain someDomain = new SomeDomain();
       someDomain.setAmount(cs.readDouble(1));
       someDomain.setIndividualFlag(cs.readChar(2,'\0'));
       someDomain.setBalance(cs.readInt(3,0));
       return someDomain;
   }
}

即使它与弹簧批FieldSet API无缝集成,这在某种程度上也不是正确的做法。

如果我想以优雅的方式默认chardouble类型而不是将它们作为String读取,检查它们是否为空并将它们转换为手动特定类型。

0 个答案:

没有答案