如何使用 Spring Batch 存储整个读取行?
How do I store the whole read line using Spring Batch?
我正在使用 Spring Boot 1.4 和 Spring Batch 1.4 读取文件,当然,还将数据解析到数据库中。
我想做的是在映射字段之前将读取的整行存储在数据库中。整行将作为字符串存储在数据库中。这是出于审计目的,因此我不想从其组件重建行字符串。
我们都见过用于从定界行获取数据的常用映射器:
@Bean
@StepScope
public FlatFileItemReader<Claim> claimFileReader(@Value("#{jobParameters[fileName]}") String pathToFile) {
logger.debug("Setting up FlatFileItemReader for claim");
logger.debug("Job Parameter for input filename: " + pathToFile);
FlatFileItemReader<Claim> reader = new FlatFileItemReader<Claim>();
reader.setResource(new FileSystemResource(pathToFile));
reader.setLineMapper(claimLineMapper());
logger.debug("Finished setting up FlatFileItemReader for claim");
return reader;
}
@Bean
public LineMapper<Claim> claimLineMapper() {
logger.debug("Setting up lineMapper");
DefaultLineMapper<Claim> lineMapper = new DefaultLineMapper<Claim>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setDelimiter("|");
lineTokenizer.setStrict(false);
lineTokenizer.setNames(new String[] { "RX_NUMBER", "SERVICE_DT", "CLAIM_STS", "PROCESSOR_CLAIM_ID", "CARRIER_ID", "GROUP_ID", "MEM_UNIQUE_ID" });
BeanWrapperFieldSetMapper<Claim> fieldSetMapper = new BeanWrapperFieldSetMapper<Claim>();
fieldSetMapper.setTargetType(Claim.class);
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(claimFieldSetMapper());
logger.debug("Finished Setting up lineMapper");
return lineMapper;
}
如果这是我的行:
463832|20160101|付费|504419000000|XYZ|黄金计划|561868
我想将“463832|20160101|PAID|504419000000|HBT|GOLD PLAN|561868”作为字符串存储在数据库中(可能还有一些额外的数据,例如 job_instance_id)。
关于如何在文件读取过程中挂钩它的任何想法?
您可以使用新的 class(建议 CustomLineMapper
),而不是使用 DefaultLineMapper
,如下所示
public class CustomLineMapper extends DefaultLineMapper<Claim> {
@Override
public Claim mapLine(String line, int lineNumber) throws Exception {
// here you can handle *line content*
return super.mapLine(line, lineNumber);
}
}
line 对象将包含映射到对象之前的原始数据。
我正在使用 Spring Boot 1.4 和 Spring Batch 1.4 读取文件,当然,还将数据解析到数据库中。
我想做的是在映射字段之前将读取的整行存储在数据库中。整行将作为字符串存储在数据库中。这是出于审计目的,因此我不想从其组件重建行字符串。
我们都见过用于从定界行获取数据的常用映射器:
@Bean
@StepScope
public FlatFileItemReader<Claim> claimFileReader(@Value("#{jobParameters[fileName]}") String pathToFile) {
logger.debug("Setting up FlatFileItemReader for claim");
logger.debug("Job Parameter for input filename: " + pathToFile);
FlatFileItemReader<Claim> reader = new FlatFileItemReader<Claim>();
reader.setResource(new FileSystemResource(pathToFile));
reader.setLineMapper(claimLineMapper());
logger.debug("Finished setting up FlatFileItemReader for claim");
return reader;
}
@Bean
public LineMapper<Claim> claimLineMapper() {
logger.debug("Setting up lineMapper");
DefaultLineMapper<Claim> lineMapper = new DefaultLineMapper<Claim>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setDelimiter("|");
lineTokenizer.setStrict(false);
lineTokenizer.setNames(new String[] { "RX_NUMBER", "SERVICE_DT", "CLAIM_STS", "PROCESSOR_CLAIM_ID", "CARRIER_ID", "GROUP_ID", "MEM_UNIQUE_ID" });
BeanWrapperFieldSetMapper<Claim> fieldSetMapper = new BeanWrapperFieldSetMapper<Claim>();
fieldSetMapper.setTargetType(Claim.class);
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(claimFieldSetMapper());
logger.debug("Finished Setting up lineMapper");
return lineMapper;
}
如果这是我的行: 463832|20160101|付费|504419000000|XYZ|黄金计划|561868
我想将“463832|20160101|PAID|504419000000|HBT|GOLD PLAN|561868”作为字符串存储在数据库中(可能还有一些额外的数据,例如 job_instance_id)。
关于如何在文件读取过程中挂钩它的任何想法?
您可以使用新的 class(建议 CustomLineMapper
),而不是使用 DefaultLineMapper
,如下所示
public class CustomLineMapper extends DefaultLineMapper<Claim> {
@Override
public Claim mapLine(String line, int lineNumber) throws Exception {
// here you can handle *line content*
return super.mapLine(line, lineNumber);
}
}
line 对象将包含映射到对象之前的原始数据。