我需要能够访问正在读取当前行的平面文件的名称。我们正在移植一个应用程序,并且当前存在的某些进程需要此信息。
这是我当前的配置:
private FlatFileItemReader<Invoice> invoiceFlatFileItemReader() throws Exception {
FlatFileItemReader<Invoice> reader = new FlatFileItemReader<>();
reader.setLinesToSkip(1); // header row
reader.setLineMapper(new InvoiceLineMapper());
reader.afterPropertiesSet();
return reader;
}
InvoiceLineMapper:
public class InvoiceLineMapper implements LineMapper<Invoice> {
@Override
public Invoice mapLine(String line, int lineNumber) throws Exception {
String[] fields = line.split(",");
ArrayList<String> fieldList = new ArrayList<>();
for (int i = 0; i < fields.length; i++) {
fieldList.add(fields[i].replaceAll("\"", "");
}
Invoice invoice = new Invoice();
invoice.setCustomerNumber(Integer.parseInt(fieldList.get(0));
invoice.setCustomerName(fieldList.get(1));
// set other things and stuff...
//Need to be able to set the file name on the model here
invoice.setFileName(theFileName);
}
}
我通过
invoiceFlatFileItemReader()
委托给MultiResourceItemReader
:@Bean
public ItemReader<Invoice> invoiceItemReader() throws Exception {
ResourcePatternResolver resolver = new PathMatchingResourcePatterResolver(this.getClass().getClassLoader());
// currently being loaded from the classpath, eventually will be read from S3...that comes later
Resource[] resources = resolver.getResources("classpath*:**/InvoiceList*.csv*");
MultiResourceItemReader<Invoice> reader = new MultiResourceItemReader<>();
reader.setResources(resources);
reader.setDelegate(invoiceFlatFileItemReader());
return reader;
}
如何获得通过链传递到资源的名称,该资源可以在
InvoiceLineMapper
类中进行访问并将其添加到模型中(以后将其保存为RepositoryItemWriter
)? 最佳答案
这就是我最终要做的,只是将MultiItemResourceReader
沿链向下传递,以便可以在行映射器中调用getCurrentResource()
:
@Bean
public ItemReader<Invoice> invoiceItemReader() throws Exception {
ResourcePatternResolver resolver = new PathMatchingResourcePatterResolver(this.getClass().getClassLoader());
// currently being loaded from the classpath, eventually will be read from S3...that comes later
Resource[] resources = resolver.getResources("classpath*:**/InvoiceList*.csv*");
MultiResourceItemReader<Invoice> reader = new MultiResourceItemReader<>();
reader.setResources(resources);
reader.setDelegate(invoiceFlatFileItemReader(reader));
return reader;
}
private FlatFileItemReader<Invoice> invoiceFlatFileItemReader(MultiResourceItemReader delegator) throws Exception {
FlatFileItemReader<Invoice> reader = new FlatFileItemReader<>();
reader.setLinesToSkip(1); // header row
reader.setLineMapper(new InvoiceLineMapper(delegator));
reader.afterPropertiesSet();
return reader;
}
然后在
InvoiceLineMapper
中:public class InvoiceLineMapper implements LineMapper<Invoice> {
private MultiResourceItemReader delegator;
public InvoiceLineMapper(MultiResourceItemReader delegator) {
this.delegator = delegator;
}
@Override
public Invoice mapLine(String line, int lineNumber) throws Exception {
String[] fields = line.split(",");
ArrayList<String> fieldList = new ArrayList<>();
for (int i = 0; i < fields.length; i++) {
fieldList.add(fields[i].replaceAll("\"", "");
}
Invoice invoice = new Invoice();
invoice.setCustomerNumber(Integer.parseInt(fieldList.get(0));
invoice.setCustomerName(fieldList.get(1));
// set other things and stuff...
Resource currentResource = delegator.getCurrentResource();
String[] fileName = currentResource.getFilename().split("/");
invoice.setFileName(filename[filename.length - 1]);
return invoice;
}
}