2016-08-31 1 views
1

Ich verwende Spring Boot 1.4 und Spring Batch 1.4, um eine Datei einzulesen und natürlich die Daten in die Datenbank zu parsen.Wie speichere ich die gesamte Leseleitung mit Spring Batch?

Was ich tun möchte, ist die gesamte Zeile in der Datenbank gelesen zu speichern, bevor die Felder zugeordnet werden. Die gesamte Zeile wird als String in der Datenbank gespeichert. Dies ist für Überwachungszwecke, daher möchte ich die Zeilenzeichenfolge nicht aus ihren Komponenten neu erstellen.

Wir haben alle gemeinsam Mapper im Einsatz gesehen die Daten aus der begrenzten Linie zu bekommen:

@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; 
} 

Wenn dies meine Reihe ist: 463.832 | 20160101 | PAID | 504419000000 | XYZ | GOLD PLAN | 561868

Ich würde "463832 | 20160101 | PAID | 504419000000 | HBT | GOLD PLAN | 561868" als Zeichenfolge in der Datenbank speichern (wahrscheinlich mit einigen zusätzlichen Daten wie job_instance_id).

Irgendwelche Ideen, wie man dies während des Dateileseprozesses einrichtet?

Antwort

1

Statt DefaultLineMapper verwenden, können Sie eine neue Klasse haben kann (vorschlagen CustomLineMapper), wie unten

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); 
    } 
} 

Linie Objekt enthält die Rohdaten, die, bevor sie auf ein Objekt abzubilden ist.

Verwandte Themen