Java 从FlatFileItemReader LineMapper访问平面文件的名称
我需要能够访问当前行读取的平面文件的名称。我们正在移植一个应用程序,目前正在进行的一些进程需要这些信息 以下是我当前的配置:Java 从FlatFileItemReader LineMapper访问平面文件的名称,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我需要能够访问当前行读取的平面文件的名称。我们正在移植一个应用程序,目前正在进行的一些进程需要这些信息 以下是我当前的配置: private FlatFileItemReader<Invoice> invoiceFlatFileItemReader() throws Exception { FlatFileItemReader<Invoice> reader = new FlatFileItemReader<>(); reader.setLin
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
类中访问该资源并将其添加到模型中(该模型随后通过RepositoryItemWriter
持久化)?您的项目可以实现一个接口ResourceAware
。如果它确实实现了该接口,则在使用MultiResourceItemReader
时,资源将自动为您注入。您可以在此处的文档中阅读有关ResourceAware
接口的更多信息:您的项目可以实现一个接口ResourceAware
。如果它确实实现了该接口,则在使用MultiResourceItemReader
时,资源将自动为您注入。您可以在此处的文档中阅读有关ResourceAware
接口的更多信息:以下是我最后做的事情,只需将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;
}
下面是我最后要做的,只是将
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;
}
ResourceAware可能的副本可能的副本从未对我起作用@michael minella。。。只是想给你一个更新。它只是一个*@实体注释的pojot,实现了
ResourceAware
?啊,我完全误解了。我认为LineMapper也应该实现ResourceAware,因为我正试图在这里setFilename
:)您的项目应该实现它。如果您这样做,MultiResourceItemReader
将为您处理设置。ResourceAware从未真正为我工作过@michael minella。。。只是想给你一个更新。它只是一个*@实体注释的pojot,实现了ResourceAware
?啊,我完全误解了。我认为LineMapper也应该实现ResourceAware,因为我正试图在这里setFilename
:)您的项目应该实现它。如果您这样做,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(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;
}
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;
}
}