我必须在 Spring Batch 期间从 MongoDB 读取整个集合而不使用过滤器。
我创建了一个扩展 MongoItemReader 的类 XyzMongoItemReader 在 XyzMongoItemReader 构造函数上,我设置以下字段:
public XyzMongoItemReader(
final MongoTemplate template,
final Query query) {
setTemplate(template);
setQuery(query);
setTargetType(Xyz.class);
}
Xyz 类用 @Document 注释,字段用 @Field 注释:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Xyz {
@Field
@JsonProperty
protected String x;
@Field
@JsonProperty
private String y;
@Field
@JsonProperty
private Z z;
}
配置类为:
@Configuration
@EnableBatchProcessing
public class XyzBatchConfigurerReaderFromMongoWriterToRedis extends AbstractBatchConfigurer<Xyz, String> {
@Autowired
MongoTemplate mongoTemplate;
@StepScope
@Bean
@Override
public ItemReader<Xyz> reader() throws Exception {
return new XyzMongoItemReader(mongoTemplate, new Query());
}
... processor ...
... writer ...
}
Mongo上的集合有20条记录,但是执行read方法时,没有检索到文档。
设置这3个参数就够了吗?
“new Query()”是能够读取集合中所有文档的正确查询吗?
我从 Query 切换到 queryString,并添加了 setCollection 和 setSort。
public XyzMongoItemReader(
final MongoTemplate template,
final String query,
final Map<String, Sort.Direction> sorts) {
setTemplate(template);
setCollection(Xyz.class.getSimpleName());
setQuery(query);
setSort(sorts);
setTargetType(parametrizedType);
}
读者:
@StepScope
@Bean
@Override
public ItemReader<Xyz> reader() throws Exception {
return new XyzMongoItemReader(mongoTemplate, "{}", Map.of("_id", Sort.Direction.ASC));
}