2017-05-08 14 views
0

私はリーダー、プロセッサー、ライターを定義しました。Springバッチは、Bean java confにないItemReaderを実装するクラスリーダーのFlatFileItemReaderを定義します。

私は読者がファイルcsvファイルからデータを取得するためには、それらのそれぞれのために自分のクラスを定義したい:私は

@Bean 
public Step stepTraitementFile() { 
    return stepBuilderFactory.get("step1") 
      .<PersonneDTO, Personne> chunk(1) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .build(); 
} 
@Bean 
public Reader reader() { 
    return new Reader(); 
} 

を持って設定Javaで

public class Reader implements ItemReader<FlatFileItemReader<PersonneDTO>>, StepExecutionListener{ 
private String file; 

@Override 
public void beforeStep(StepExecution stepExecution) { 
    file = (String) stepExecution.getJobExecution().getExecutionContext().get("personneFile"); 
} 

@Override 
public FlatFileItemReader<PersonneDTO> read() 
     throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { 
    FlatFileItemReader<PersonneDTO> reader = new FlatFileItemReader<PersonneDTO>(); 
     reader.setResource(new FileSystemResource(file)); 
     reader.setLineMapper(new DefaultLineMapper<PersonneDTO>() {{ 
      setLineTokenizer(new DelimitedLineTokenizer() {{ 
       setNames(new String[] {"nom", "prenom" ,"dateNaissance" }); 
      }}); 
      setFieldSetMapper(new BeanWrapperFieldSetMapper<PersonneDTO>() {{ 
       setTargetType(PersonneDTO.class); 
      }}); 
     }}); 
     return reader; 
} 

@Override 
public ExitStatus afterStep(StepExecution stepExecution) { 
    return null; 
} 

} 私は設定javaにエラーがあります。SimpleStepBuilderタイプのメソッドリーダー(ItemReader)は、引数(Reader)には適用されません。 ネットで見たすべての例では、設定クラスにリーダーが設定されています。

+0

なぜですか?現在の設定では、通常のコールバックを取得しないため、リーダの適切なセットアップが無効になります。追加されたレイヤが混乱と複雑さを増やさない理由は何ですか? .. –

+0

私は別名のクラスで読者を使う必要があります。なぜなら、私が欲しい人から持っているファイル名は、私がやりたいことを理解するためのコードを更新したからです – user3816170

答えて

0

ファイル名の生成方法がわかりませんが、late bindingを使用して問題を解決できます。 Lateバインディングを使用すると、後で必要な情報が利用可能になった時点でSpringバッチBeanをインスタンス化できます。レイトバインディングを使用するには、「通常の」FlatFileItemReaderを使用しますが、「ステップ」スコープを使用してください。次のようなもの:

@Bean 
@StepScope 
public FlatFileItemReader<PersonneDTO> reader(@Value("#{jobExecutionContext['personneFile']}") String pathToDFile) { 
    FlatFileItemReader<PersonneDTO> reader = new FlatFileItemReader<PersonneDTO>(); 
    reader.setResource(new FileSystemResource(pathToDFile)); 
    reader.setLineMapper(new DefaultLineMapper<PersonneDTO>() {{ 
     setLineTokenizer(new DelimitedLineTokenizer() {{ 
      setNames(new String[] {"nom", "prenom" ,"dateNaissance" }); 
     }}); 
     setFieldSetMapper(new BeanWrapperFieldSetMapper<PersonneDTO>() {{ 
      setTargetType(PersonneDTO.class); 
     }}); 
    }}); 
    return reader; 
    } 
関連する問題