我的处理器返回一个对象列表,但我找不到覆盖 MongoItemWriter 来写入一些对象列表而不是对象的解决方案。
我试过这个。 我的处理器:
@Override
public List<PEntity> process(PSEntity item) {
log.trace("Traitement d'une entrée PSEntity: {}", item);
List<PL> r = this.r.findRP(item.getP());
if (r.isEmpty()) {
return null;
}
for (PL r : r) {
r.setRr(true);
r.setHr(LocalDateTime.now());
}
List<PLEntity> pLEntities =
r.stream().map(this.pDM::ppDMEntity).toList();
return pLEntities;
}
我的作家
public class RMongoWriter<T> extends MongoItemWriter<List<T>> {
private MongoOperations template;
private MongoItemWriter<T> delegate;
@Override
public void write(final List<? extends List<T>> lists) throws Exception {
for (final List<T> list : lists) {
delegate.write(list);
}
}
@Bean
public MongoItemWriter<List<PLEntity>> writer(MongoTemplate mongoTemplate,
BatchConfigurationProperties batchConfigurationProperties) {
MongoItemWriter<List<PlaqueLueEntity>> writer = new MongoItemWriter<>();
writer.setTemplate(mongoTemplate);
writer.setCollection(String.valueOf(CollectionEnum.COLLECTION.PL));
return writer;
}
我在 BatchConfiguration 中定义:
@Bean
public MongoItemWriter<List<PlaqueLueEntity>> rWriter() {
return new RMongoWriter().writer(mongoTemplate, batchConfigurationProperties);
}
但是在我调试我的编写器之前,我收到了这个错误:
class org.bson.Document cannot be cast to class java.util.Collection (org.bson.Document is in unnamed module of loader 'app'; java.util.Collection is in module java.base of loader 'bootstrap')
并且:
Attempt to update step execution id=1 with wrong version (1), where current version is 2
我没有找到覆盖 MongoItemWriter 来写入一些对象列表而不是对象的解决方案。
您定义自定义项目编写器的方式是正确的:
public class RapprochementMongoWriter<T> extends MongoItemWriter<List<T>> {
private MongoItemWriter<T> delegate;
//...
}
但是,您不应该像这样为每个列表调用代表:
@Override
public void write(final List<? extends List<T>> lists) throws Exception {
for (final List<T> list : lists) {
delegate.write(list);
}
}
您应该做的是“展平”单个列表中的项目并调用委托一次,如下所示:
@Override
public void write(final List<? extends List<T>> lists) throws Exception {
List<T> flatList = new ArrayList();
for (final List<T> list : lists) {
for (T item: list) {
flatList.add(item);
}
}
delegate.write(flatList);
}
请注意,我没有编译该代码片段,因此如果需要,我会让您对其进行调整,但您已经明白了。