Spring Batch FlatFileItemReader在读取的所有项目/行中填充字段值



我正在使用spring-batch FlatFileItemReader读取一个平面文件。

我有一个requestId字段,需要为从平面文件中读取的所有记录填充一个唯一值。当我读文件1时。我想将在requestId字段中创建的所有Item对象的requestId设置为1。对于file2,我需要将requestId设置为2。

我的requestId是由一个单独的类唯一生成的。

如何使用弹簧批实现这一点?

有一些可能的解决方案

使用资源感知项目

public class MyItem implements ResourceAware {
    private Resource resource;
    public String getId() {
        return createIdFromResource(resource);
    }
    private String createIdFromResource(final Resource resource) {
        // create your ID here
        return resource.getFilename();
    }
    @Override
    public void setResource(final Resource resource) {
        this.resource = resource;
    }
}

使用监听器(这里有接口,也可以不那么冗长地使用注释)

public class TestListener implements StepExecutionListener, ItemReadListener<String> {
    private StepExecution stepExecution;
    private static final String CURRENT_ID = "currentId";
    @Override
    public void beforeStep(final StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }
    @Override
    public ExitStatus afterStep(final StepExecution stepExecution) {
        return null;
    }
    @Override
    public void beforeRead() {
    }
    @Override
    public void afterRead(final String item) {
        String currentId = null;
        if (stepExecution.getExecutionContext().containsKey(CURRENT_ID)) {
            currentId = stepExecution.getExecutionContext().getString(CURRENT_ID);
        } else {
            String fileName = stepExecution.getExecutionContext().getString("fileName");
            // ... create ID from FileName
            currentId = fileName + "foo";
            stepExecution.getExecutionContext().put(CURRENT_ID, currentId);
        }
    }
    @Override
    public void onReadError(final Exception ex) {
    }
}

在上面的示例中,当前的fileName在步骤ExecutionContext中可用,您可能必须从jobParameters中提取它并提取文件名

String paramValue = stepExecution.getJobExecution().getJobParameters().getString("paramName");
// extract fileName from paramValue

最新更新