我正在使用Spring批处理框架来解析固定长度的平面文件,使用
FlatFileItemReader
和lineMapper作为DefaultLineMapper
和fieldSetMapper作为PassThroughFieldSetMapper和lineTokenizer作为PatternMatchingCompositeLineTokenizer。
但是我在处理方面面临一些问题,因为文件中的值可能有空格。 FieldSet 在删除任何前导或尾随空格后给我值。我想要带有空格的值(如果有的话)用于某些验证目的。
我是 Spring Batch 框架的新手。有人可以告诉我如何解决这个问题吗?
我知道很久以前就有人问过这个问题了,但如果有人有同样的问题:
问题出在 FieldSet 类上,因为当您调用
fieldSet.readString()
时,它将调用 readAndTrim()
方法并返回修剪后的字符串。
要保留保留空格的字符串,您应该调用 fieldSet.readRawString()
我也只是想回答一下这个问题:
您可以创建自己的
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')
)
}
}
您可以创建自定义
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