2017-12-27 10 views
1

私はCSVファイルから読み込み、画面に行を書き込むためにSpring Batchを使用しています。 私の仕事は3つの部分で構成されています: パート1:ディスク上のINPUTディレクトリにCSVファイルが存在するかどうかを確認し、TRUEを返した場合はPRODという別のディレクトリに移動します。 パート2:FlatFileItemReaderを使用してCSVファイルからデータを抽出します。 パート3:すべてのアイテムを画面に書き込みます。ファイルを移動した後にFlatFileItemReaderのリソースが見つかりません

問題はFlatFileItemReaderがここjava.lang.IllegalArgumentException: Input resource must be set

によって引き起こさorg.springframework.batch.item.ItemStreamException: Failed to initialize the readerが私のコードでスローです:

@Bean 
public FlatFileItemReader<UniversInvestissement> reader() { 
    FlatFileItemReader<UniversInvestissement> reader = new FlatFileItemReader<>(); 
    File csvFile = new File("C://INPUT/data.csv"); 
    Resource resource = resourceLoader.getResource("file:" + csvFile.getAbsolutePath()); 
    reader.setLinesToSkip(1); 
    reader.setResource(resource); 
    DefaultLineMapper lineMapper = new DefaultLineMapper(); 

    DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); 
    tokenizer.setNames(new String[]{"COL1", "COL2", "COL3", "COL4"}); 
    tokenizer.setDelimiter(";"); 

    FieldSetMapper fieldSetMapper = new UniversInvestissementFieldSetMapper(); 
    lineMapper.setLineTokenizer(tokenizer); 
    lineMapper.setFieldSetMapper(fieldSetMapper); 

    reader.setLineMapper(lineMapper); 

    reader.setEncoding("Cp1252"); 
    return reader; 
} 

@Bean 
public UniversInvestissementWriter writer() { 
    return new UniversInvestissementWriter(); 
} 

@Bean 
public UniversInvestissementProcessor processor() { 
    return new UniversInvestissementProcessor(); 
} 

@Bean 
public Step extractData() { 
    return steps.get("extractData") 
      .<UniversInvestissement, UniversInvestissementProcessorResult>chunk(1) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .build(); 
} 

実際に問題がFlatFileItemReaderが初期化されるとき、それはとしてCSVファイルを見つけることができないということですリソース! リソースの割り当てを延期し、この例外を回避する方法はありますか?

+0

[タグ:バッチファイル]タグは、多くのファイルを処理することを意味しないことに注意してください。タグの上にマウスを置くと、その実際の意味を見ることができます。 – SteveFest

+0

@SteveFest、そうです。しかし、それは自動的に提案されたので、私はそれが同じコンテキストではないことを知らなかったそれを選んだ;)とにかくありがとう –

+0

ありがとう、返信してください。間違った「自動修正」の別のケースを見るのは悲しいことです。 – SteveFest

答えて

0

使用可能reader.setStrict(false);厳密モードをfalseに設定すると、リーダーは例外をスローしません。あなたは読者を怠惰にするために@StepScopeを使わなければならないかもしれません。これはCSVファイルには、私のディスク上のいくつかの入力ディレクトリに存在する場合、それはファイルと呼ばれる別のディレクトリに移動されますTRUEを返し 場合

+0

strictモードをfalseに設定した後は例外はありませんが、リーダがnullリソースで初期化され、CSVファイルが読み込まれないという問題があります。( –

+0

@stepscopeを使用して読者を怠惰にする必要があります – Niraj

0

が、確認できます、希望を私は同じ設定を使用していますが、それは私のために正常に動作していますこの問題はイースリーもちろんJobExecutionDecider

class Checker implements JobExecutionDecider { 
    FlowExecutionStatus decide(...) { 
    if(<file not found in INPUT/ dir>) { 
     return FlowExecutionStatus.STOPPED; 
    } 
    if(!<copy file from INPUT/ to PROD/ works>) { 
     return FlowExecutionStatus.FAILED; 
    } 
    return FlowExecutionStatus.COMPLETED; 
    } 
} 

を使用して解決することができる PROD

は、extractData()は、プログラムの開発の使用を挿入するように変更する必要がありますアトミックなフローの決定(簡単な例の場合hereを確認してください)

0

あなたのresourceLoaderの問題は、そのような例外がリソースインスタンスのnull以外のアサーションによってスローされたと思います。だからresourceLoader null値を返します。

FileSystemResourceとリソースローダーを使用しないでください。例:

reader.setResource(new FileSystemResource(csvFile)); 
関連する問題