Я на самом деле использую Spring Batch, и я задавал себе несколько вопросов об общих методах.Рассматривая следующий фрагмент кода:
public <I, O> SimpleStepBuilder<I, O> chunk(int chunkSize) {
return new SimpleStepBuilder<I, O>(this).chunk(chunkSize);
}
Если мы проверим внутри источника, немного дальше, мы столкнемся:
public SimpleStepBuilder<I, O> reader(ItemReader<? extends I> reader) {
this.reader = reader;
return this;
}
Я понимаю, что цепочка вызовов выглядит следующим образом:
@Bean
public Step step(final AccountReader accountReader, final AccountProcessor accountProcessor) {
return stepBuilderFactory.get("step")
.<COR_ACC_ACCOUNT, Account>chunk(10)
.reader(accountReader)
.processor(accountProcessor)
.writer(new JsonWriter<>())
.build();
}
Что метод reader()
потребует ItemProcessor<COR_ACC_ACCOUNT>
Я нашел этот тип круто, чтобы сохранить безопасность типов.
Теперь моя проблема.Учитывая следующий код:
@Component
public class ItemDictionary {
private final Map<Class, ItemReader> itemReaders;
@Autowired
public ItemDictionary(final List<ItemReader> readers) {
itemReaders = readers.stream().collect(Collectors.toMap(
ItemReader::getClass,
Function.identity()
));
public <I> ItemReader<I> getReader(final Class clazz) {
return itemReaders.get(clazz);
}
}
Я хотел определить Step
, определенный выше, следующим образом:
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.<COR_ACC_ACCOUNT, Account>chunk(10)
.reader(<COR_ACC_ACCOUNT>itemDictionary.getReader(AccountReader.class))
.processor(accountProcessor)
.writer(new JsonWriter<>())
.build();
}
itemDictionary
- это, в основном, Карта, содержащая все ItemReader
реализации, присутствующие в моем контексте Spring.
Этот вызов <COR_ACC_ACCOUNT>itemDictionary.getReader(AccountReader.class)
отклонен компилятором как illegal start of expression
Я что-то упустил?
Возможно ли ещесохранить тип безопасной проверки с помощью ItemDictionnary
?