java - Can I use placeholders in an @Value annotated Resource? -


i trying build spring batch job, user gives path directory input. in directory csv-file , name of file different. defining itemreader java config:

@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; } 

when run job following error:

caused by: java.lang.illegalstateexception: input resource must exist (reader in 'strict' mode): url [file:c:/path/to/directory/*.csv]     @ org.springframework.batch.item.file.flatfileitemreader.doopen(flatfileitemreader.java:251)     @ org.springframework.batch.item.support.abstractitemcountingitemstreamitemreader.open(abstractitemcountingitemstreamitemreader.java:144)     ... 26 more 

obviously not possible use asterisk placeholder @ place. there other way path of csv file dynamically?

if sure directory , there 1 csv file always, can go create file object directory , first item listfiles(), create resource object, shown below:

public flatfileitemreader<myobject> itemreader(         @value("file:#{jobparameters['directory']}") final string resourcedir,         final defaultlinemapper<myobject> linemapper) {          file[] files=new file(resourcedir).listfiles(); // can try giving filenamefilter .csv         file csvfile=files[0]; // null check , 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; } 

or, if .csv file name has static prefix or suffix can try existing code itself. please check section 6.7.2 wildcards in application context constructor resource paths here. example, suppose in case .csv file has pattern abc*.csv:

 @value("file:#{jobparameters['directory']}/abc*.csv") 

Comments