Spring批处理不使用FlatFileItemWriter〈List>进行写入和接受< MainDTO>

huwehgph  于 2023-03-11  发布在  Spring
关注(0)|答案(2)|浏览(130)

我真的希望任何人都可以回答我的问题,关于 Spring 批处理作家。
我的目标是:

  • 从父表读取所有数据
  • 处理来自读取器的数据,结果存储到公共DTO,如下所示:
public class CommonDTO{

    private ParentDTO parentDTO;
    private List<Child1DTO> child1DTOList;
    private List<Child2DTO> child2DTOList;
}

这些DTO具有处理后的数据。
当我将这些文件写入.dat文件时,问题开始出现。在调用编写器时,应该有3个生成的.dat文件。

  • ParentDTO应生成为独占1 .dat文件。
  • child1DTOList应生成为另一个1 .dat文件专用。
  • child2DTOList应生成为另一个1 .dat文件专用。

child1DTOListchild2DTOList取决于ParentDTO数据,特别是来自读卡器的主要ID。
数据库设计:

**父表字段:**主ID
**子1表字段:**来自父表的外键(可以多于1,这就是为什么我在处理器中返回列表。
子2表字段:来自父表的外键(可以大于1,这就是为什么我在处理器中返回列表。

我应该如何设计的作家,以生成3 .dat文件?我正在使用FlatFileItemWriter<List<Child1DTO>>,但它并没有真正的工作和写作。
先谢谢你的帮助。
我正在使用FlatFileItemWriter<List<Child1DTO>>,但它不是真的工作,并生成.dat文件。我可以重新设计我的实现,如果有一个更好的方法来做。

nkoocmlb

nkoocmlb1#

在为每个孩子添加Bean后,请添加这部分代码,如果有问题请发送错误消息到这里。

public class CommonDTOItemWriter implements ItemWriter<CommonDTO> {

    @Autowired
    private FlatFileItemWriter<ParentDTO> parentWriter;

    @Autowired
    private FlatFileItemWriter<Child1DTO> child1Writer;

    @Autowired
    private FlatFileItemWriter<Child2DTO> child2Writer;

    @Override
    public void write(List<? extends CommonDTO> items) throws Exception {
        for (CommonDTO item : items) {
            // Write parentDTO to parent.dat
            parentWriter.write(Arrays.asList(item.getParentDTO()));

            
            child1Writer.write(item.getChild1DTOList());

            
            child2Writer.write(item.getChild2DTOList());
        }
    }
}

如果您遗漏了以下内容,请添加此部分:

public class Child1DTOItemWriter extends FlatFileItemWriter<Child1DTO> {

    @Value("${output.file.path}")
    private String outputPath;

    private String filename;

    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {
        filename = outputPath + "child1DTO_" + stepExecution.getStepName() + ".dat";
        this.setResource(new FileSystemResource(filename));
        this.setAppendAllowed(true);
        this.setHeaderCallback(writer -> writer.write("Header line"));
        this.setFooterCallback(writer -> writer.write("Footer line"));
        this.setLineAggregator(new PassThroughLineAggregator<>());
        this.open(stepExecution.getExecutionContext());
    }

    @Override
    public void write(List<? extends Child1DTO> items) throws Exception {
       
        super.write(items);
    }
}

在属性文件中添加:

output.file.path=output/

@Bean
@StepScope
public FlatFileItemWriter<ParentDTO> parentDTOFlatFileItemWriter(@Value("#{stepExecutionContext['output.file.path']}") String filePath) {
    return new FlatFileItemWriterBuilder<ParentDTO>()
            .name("parentDTOFlatFileItemWriter")
            .resource(new FileSystemResource(filePath + "/parentDTO.dat"))
            .delimited()
            .delimiter(",")
            .names("parentField1", "parentField2", "parentField3") // replace with your actual field names
            .build();
}

@Bean
@StepScope
public FlatFileItemWriter<List<Child1DTO>> child1DTOFlatFileItemWriter(@Value("#{stepExecutionContext['output.file.path']}") String filePath) {
    return new FlatFileItemWriterBuilder<List<Child1DTO>>()
            .name("child1DTOFlatFileItemWriter")
            .resource(new FileSystemResource(filePath + "/child1DTO.dat"))
            .delimited()
            .delimiter(",")
            .names("child1Field1", "child1Field2", "child1Field3") // replace with your actual field names
            .build();
}

@Bean
@StepScope
public FlatFileItemWriter<List<Child2DTO>> child2DTOFlatFileItemWriter(@Value("#{stepExecutionContext['output.file.path']}") String filePath) {
    return new FlatFileItemWriterBuilder<List<Child2DTO>>()
            .name("child2DTOFlatFileItemWriter")
            .resource(new FileSystemResource(filePath + "/child2DTO.dat"))
            .delimited()
            .delimiter(",")
            .names("child2Field1", "child2Field2", "child2Field3") // replace with your actual field names
            .build();
}
hc2pp10m

hc2pp10m2#

应该为不同的文件编写不同的Bean。
例如:

@Bean
public FlatFileItemWriter<Child1DTO> child1Writer() {
    FlatFileItemWriter<Child1DTO> writer = new FlatFileItemWriter<>();
    writer.setResource(new FileSystemResource("child1.dat"));
    writer.setLineAggregator(new PassThroughLineAggregator<>());
    return writer;
}

相关问题