如何在writer调用前修改待传递的item列表?
解决方案
你可以通过封装原有ItemWriter实现自定义代理Writer来实现需求,这是Spring Batch下处理该类场景的标准实现方式,具体逻辑如下:
- 自定义类实现
ItemWriter<T>接口,将你原本使用的实际执行写入的Writer作为构造参数传入该自定义类 - 重写
write(List<? extends T> items)方法,方法内首先对传入的当前批次完整item列表做你需要的修改:包括去重、过滤、字段批量调整等自定义操作 - 完成列表修改后,将调整后的列表传递给原有Writer的write方法执行实际写入逻辑
- 最后在对应Step的配置中,把原本配置的Writer替换为这个自定义的代理Writer即可
示例代码
public class ModifyItemProxyWriter<T> implements ItemWriter<T> { private final ItemWriter<T> delegate; public ModifyItemProxyWriter(ItemWriter<T> delegate) { this.delegate = delegate; } @Override public void write(List<? extends T> items) throws Exception { // 此处编写列表修改逻辑,以下为去重示例 List<T> modifiedItems = items.stream() .distinct() .toList(); // 传入修改后的列表执行原写入逻辑 delegate.write(modifiedItems); } }
如果你的修改逻辑不需要复用到其他Step,也可以直接改造原有Writer的write方法,在执行写入逻辑前先处理item列表,无需单独封装代理类。
内容的提问来源于stack exchange,提问作者Arpan Parikh
相关产品推荐
相关产品推荐

