2015-07-21 92 views
0

我正在嘗試構建一個Spring Batch作業,其中用戶將路徑作爲輸入提供給目錄。在這個目錄中是一個csv文件,這個文件的名字總是不同的。我定義我ItemReader與此Java配置:我可以在@Value註釋的資源中使用佔位符嗎?

@Bean 
@StepScope 
public FlatFileItemReader<MyObject> itemReader(
     @Value("file:#{jobParameters['directory']}/*.csv") final Resource resource, 
     final DefaultLineMapper<MyObject> lineMapper) { 
    final FlatFileItemReader<MyObject> reader = new FlatFileItemReader<>(); 

    reader.setResource(resource); 
    reader.setLinesToSkip(1); 
    reader.setLineMapper(lineMapper); 

    return reader; 
} 

當我跑我得到以下錯誤的工作:

Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file:C:/path/to/directory/*.csv] 
    at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:251) 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144) 
    ... 26 more 

顯然,這是不可能在這個地方用星號作爲佔位符。有沒有其他方式動態獲取csv文件的路徑?

+1

的'FlatFileItemReader'需要一個實際的文件不是一個目錄或通配符。 'FlatFileItemReader'也拋出異常。在那裏放置一些邏輯,從給定的目錄中獲取文件的名稱。 –

+0

你在那裏的意思是什麼? – stevecross

+1

在你的'@ Bean'方法中。 –

回答

0

如果你是肯定的目錄,只有一個CSV文件始終,那麼你可以去從listFiles()的目錄中創建File對象,並得到第一個項目,然後創建資源對象,如下圖所示:

public FlatFileItemReader<MyObject> itemReader(
     @Value("file:#{jobParameters['directory']}") final String resourceDir, 
     final DefaultLineMapper<MyObject> lineMapper) { 

     File[] files=new File(resourceDir).listFiles(); // you can try giving FileNameFilter for .csv 
     File csvFile=files[0]; // do null check and isempty 
     // create Resource 
     Resource resource = new FileSystemResource(csvFile); 
    final FlatFileItemReader<MyObject> reader = new FlatFileItemReader<>(); 

    reader.setResource(resource); 
    reader.setLinesToSkip(1); 
    reader.setLineMapper(lineMapper); 

    return reader; 
} 

或者,如果.csv文件名有任何靜態前綴或後綴,您可以嘗試使用現有的代碼本身。請檢查第節6.7.2應用上下文構造器資源路徑中的通配符here。例如,假設你的情況.csv文件有一個模式abc*.csv

@Value("file:#{jobParameters['directory']}/abc*.csv") 
相關問題