23 Haziran 2020 Salı

SpringBatch FlatFileItemReaderBuilder Sınıfı - Dosya Okur

Giriş
Şu satırı dahil ederiz
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
Bu sınıf ile bir FlatFileItemReader yani ItemReader yaratılır.

setLineMapper metodu - DefaultLineMapper
DefaultLineMapper verilebilir.

Örnek - FieldSetMapper'dan Kalıtım
Kendi Customer sınıfımızı CSV dosyasından okumak için şöyle yaparız.
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;

@Bean
public FlatFileItemReader<Customer> customerItemReader(){

  FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
  reader.setLinesToSkip(1);
  reader.setResource(new ClassPathResource("/data/customer.csv"));

  DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
  tokenizer.setNames(new String[] {"id", "firstName", "lastName", "birthdate"});

  DefaultLineMapper<Customer> customerLineMapper = new DefaultLineMapper<>();
  customerLineMapper.setLineTokenizer(tokenizer);
  customerLineMapper.setFieldSetMapper(new CustomerFieldSetMapper());
  customerLineMapper.afterPropertiesSet();

  reader.setLineMapper(customerLineMapper);
  return reader;
}
Kendi Customer sınıfımızı doldurmak için şöyle yaparız
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;

public class CustomerFieldSetMapper implements FieldSetMapper<Customer> {

  @Override
  public Customer mapFieldSet(FieldSet fieldSet) throws BindException {
    return Customer.builder()
      .id(fieldSet.readLong("id"))
      .firstName(fieldSet.readRawString("firstName"))
      .lastName(fieldSet.readRawString("lastName"))
      .birthdate(fieldSet.readRawString("birthdate"))
      .build();
  }
}
fieldSetMapper metodu
setLineMapper() ile verilen nesne yerine kullanılabilir

Örnek - Lambda
Şöyle yaparız
// the FileReader takes the path to the file as parameters
@StepScope
@Bean
public FlatFileItemReader<Title> titleCsvReaderString inputFile){
  return new FlatFileItemReaderBuilder<Title>()
    .name("titles.csv reader")
    .resource(new FileSystemResource(inputFile))
    .delimited()
    .delimiter(",")
    .names(new String[]{"id",
                        "title",
                        "type",
                        "description",
                        "release_year",
                        "age_certification",
                        "runtime",
                        "genres",
                        "production_countries",
                        "seasons",
                        "imdb_id",
                        "imdb_score",
                        "imdb_votes",
                        "tmdb_popularity",
                        "tmdb_score"
      })
  .linesToSkip(1)
  .fieldSetMapper(fieldSet -> new Title(fieldSet.readString("id"),...))
  .beanMapperStrict(false)
  .build();
}
linesToSkip metodu
CSV gibi dosyalarda bazen ilk bir kaç satırı atlamak gerekebilir
Örnek
Şöyle yaparız
@Bean(name = "readerNewsReportCSVFile")
public ItemReader<NewsReport> readerNewsReportCSVFile(){
  return new FlatFileItemReaderBuilder<NewsReport>()
    .name("readerNewsReportCSVFile")
    .resource(new FileSystemResource("dataset/FakeNewsNet.csv"))
    .linesToSkip(1)
    .delimited()
    .names("title","news_url","source_domain","tweet_num","real")
    .targetType(NewsReport.class)
    .build();
}
names metodu
Okunacak alan isimlerini belirtir

resource metodu
Okunacak dosyayı belirtir
Örnek
Şöyle yaparız
@Bean
public FlatFileItemReader<String> textItemReader() {
  return new FlatFileItemReaderBuilder<String>()
    .name("textItemReader")
    .resource(phishingDatabaseLinksClassPathResource)
    .lineMapper(new PassThroughLineMapper())
    .build();
Örnek
Şöyle yaparız.
@Bean
public FlatFileItemReader<Voltage> reader() {
  return new FlatFileItemReaderBuilder<Voltage>()
    .name("voltItemReader")
    .resource(new ClassPathResource("Volts.csv"))
    .delimited()
    .names(new String[]{"volt", "time"})
    .lineMapper(lineMapper())
    .fieldSetMapper(new BeanWrapperFieldSetMapper<Voltage>() {{
      setTargetType(Voltage.class);
    }})
    .build();
}

Hiç yorum yok:

Yorum Gönder