如何使用MongoItemWriter编写List<T>

问题描述 投票:0回答:1

我的处理器返回一个对象列表,但我找不到覆盖 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

java mongodb spring-batch d itemwriter
1个回答
1
投票

我没有找到覆盖 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);
  }

请注意,我没有编译该代码片段,因此如果需要,我会让您对其进行调整,但您已经明白了。

© www.soinside.com 2019 - 2024. All rights reserved.