Я пытаюсь получить доступ к параметрам задания в ItemReader
, как показано ниже, но при попытке передать некоторые значения невозможно или я получаю некоторые ошибки, например.
«Не удалось инициализировать средство чтения: невозможно определить имя коллекции по типу «org.bson.Document». Это собственный тип хранилища?»
или
«Ошибка при закрытии средства чтения элементов. Невозможно вызвать «org.springframework.data.util.CloseableIterator.close()», поскольку «this.cursor» имеет значение null»
Чтобы передать параметры задания в ItemReader, я использую StepExecution
, как показано ниже, но поскольку конструктор CustomDataReader
выполняется перед методом beforeStep
, я получаю ошибку в строке setCollection(collectionName)
. Итак, как это исправить?
@Getter
@Setter
@StepScope
@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {
@Value("#{jobParameters['collectionName']}")
private String collectionName;
@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
JobParameters jobParameters =
stepExecution.getJobParameters();
setCollectionName(parameters.getParameter("collectionName")
.getValue().toString());
}
// @Autowired
public CustomDataReader(
@Qualifier("mongoTemplate") MongoTemplate mongoTemplate
) {
setName("customDataReader");
setTargetType(Document.class);
setTemplate(mongoTemplate);
setCollection(collectionName);
setBatchSize(DEFAULT_CHUNK_SIZE);
setLimit(DEFAULT_LIMIT_SIZE);
setQuery(query);
}
}
Я ищу решение без использования этих параметров задания в BatchConfig
и только изменяю эту программу чтения.
Я исправил проблему, установив параметры в методе beforeStep
, как показано ниже:
@StepScope
@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {
private String collectionName;
@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
JobParameters jobParameters =
stepExecution.getJobParameters();
setCollection(jobParameters.getString("collectionName"));
}
@Autowired
public CustomDataReader(
@Qualifier("mongoTemplate") MongoTemplate mongoTemplate
) {
setName("customDataReader");
setTargetType(Document.class);
setTemplate(mongoTemplate);
setBatchSize(DEFAULT_CHUNK_SIZE);
setLimit(DEFAULT_LIMIT_SIZE);
}
}
@anicetkeric Спасибо, но когда я пытаюсь без @StepScope
, я получаю сообщение «Ошибка создания bean-компонента с именем 'customReader', определенным в файле [/<project-name>/build/classes/java/main/company/batch/reader/CustomDataReader .class]: требуется запрос." ошибка.
@StepScope используется в любом @Bean, которому необходимо внедрить @Values из контекста шага, и в любом bean-компоненте, которому необходимо разделить жизненный цикл с выполнением шага. https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/core/configuration/annotation/StepScope.html
Вот код без @StepScope и установки запроса по умолчанию.
@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {
@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
JobParameters jobParameters = stepExecution.getJobParameters();
setCollection(jobParameters.getString("collectionName"));
}
public CustomDataReader(@Autowired MongoTemplate mongoTemplate) {
setName("reader");
setTargetType(Document.class);
setTemplate(mongoTemplate);
setBatchSize(DEFAULT_CHUNK_SIZE);
setLimit(DEFAULT_LIMIT_SIZE);
setSort(new HashMap<>());
setQuery(new Query());
}
}
Добавление setQuery(new Query());
сработало, большое спасибо.
Вам не нужен @StepScope