Spring 批处理中平面文件中的空格问题

问题描述 投票:0回答:3

我正在使用Spring批处理框架来解析固定长度的平面文件,使用

FlatFileItemReader
lineMapper作为
DefaultLineMapper
fieldSetMapper作为PassThroughFieldSetMapper和lineTokenizer作为PatternMatchingCompositeLineTokenizer。

但是我在处理方面面临一些问题,因为文件中的值可能有空格。 FieldSet 在删除任何前导或尾随空格后给我值。我想要带有空格的值(如果有的话)用于某些验证目的。

我是 Spring Batch 框架的新手。有人可以告诉我如何解决这个问题吗?

java spring-batch
3个回答
3
投票

我知道很久以前就有人问过这个问题了,但如果有人有同样的问题:

问题出在 FieldSet 类上,因为当您调用

fieldSet.readString()
时,它将调用
readAndTrim()
方法并返回修剪后的字符串。 要保留保留空格的字符串,您应该调用
fieldSet.readRawString()


0
投票

我也只是想回答一下这个问题:

您可以创建自己的

FieldMapper
实现并将其自动连接到您的
lineMapper.setFieldSetMapper()

@Component
class CustomFieldSetMapper implements FieldSetMapper<Partnership>{

    @Override
    public Partnership mapFieldSet(FieldSet fieldSet) throws BindException {

        return new Partnership(
                partnerCrmId:fieldSet.readString('partnerCrmId'),
                partnerType: fieldSet.readString('partnerType'),
                customerCrmId: fieldSet.readString('customerCrmId'),
                startDate: fieldSet.readString('startDate'),
                endDate: fieldSet.readString('endDate'),
                clientId: fieldSet.readRawString('clientId'),
                status: fieldSet.readString('status'),
                type: fieldSet.readString('type'),
                providerCode: fieldSet.readString('providerCode'),
                lastModifiedDate: fieldSet.readString('lastModifiedDate')
        )

    }
}

0
投票

您可以创建自定义

FieldSetMapper
并仅映射您想要的字段。我用的是
BeanWrapperFieldSetMapper

BeanWrapperFieldSetMapper<Partnership> fieldSetMapper = new BeanWrapperFieldSetMapper<Partnership>() {
    @Override
    public Partnership mapFieldSet(FieldSet fs) throws BindException {
        Partnership partnership = super.mapFieldSet(fs);

        // You override the value here with the raw string.
        partnership.setClientId(fs.readRawString("clientId"));

        return partnership;
    }
};
fieldSetMapper.setTargetType(Partnership.class);

在示例中,您首先调用

super.mapFieldSet(fs);
来映射所有字段(默认情况下,这将映射不带空格的字段),然后手动映射各个字段以覆盖其值。您可以通过调用
fieldSet.readRawString()
来获取带有空格的值。

来源:https://github.com/spring-projects/spring-batch/issues/1198#issuecomment-566274707

© www.soinside.com 2019 - 2024. All rights reserved.