ClassPathResource と FileSystemResource[プログラミング]
(2026-06-24 21:04:17) by shinoda


Spring Batch のプログラムを実行すると、

org.springframework.batch.infrastructure.item.ItemStreamException:
Failed to initialize the reader

というエラーになる。reader の初期化失敗?

AI様にお伺いを立てると、「指定したファイルが読めない」ということのようだ。

ネットで見つけたサンプルコードのファイル名だけ変えてみたのだが、それがいけなかった。やっぱちゃんと出てきたステートメントの意味を調べつつやらないといかんね(^^;

読み込むファイルは、'src/main/resources' といったクラスパス(プロジェクト内のパス)ではなく、その外に存在している。
具体的には、'C:\Users\lovelychan\Documents\testdata_20260623_091037.txt' である。

最初、FlatFileItemReaderBuilder の resource を

.resource(new ClassPathResource("C:\\Users\\lovelychan\\Documents\\testdata_20260623_091037.txt"))

という具合に、ClassPathResource として指定していたので、プログラムは

src/main/resources/C:/Users/lovelychan/Documents/testdata_20260623_091037.txt

というわけわからんパスを探しに行って、Failed to initialize the reader になっちゃうのよね。

.resource(new FileSystemResource("C:\\Users\\lovelychan\\Documents\\testdata_20260623_091037.txt"))

という具合に OS のファイルシステム(外部の特定のフォルダ)のパスとして指定することで正常に実行されるようになった。

ちなみにクラスパス(ClassPathResource)として指定するファイルは、JARファイルなどに同梱する静的ファイルのようだ。例えばメッセージ番号とメッセージの対応表とか、そんな感じのやつかな。
サンプルプログラムだと、sample.txt をクラスパスに置いてるケースが多いが、実際の業務用のバッチであれば、処理対象のファイルは絶対クラスパスの外にいるわけで、基本的には FileSystemResource の設定となるね。

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8