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