-
Couldn't load subscription status.
- Fork 2.4k
Description
I've recently encountered the need for an adapter to use an existing ItemWriter<SimpleType> in a step that works with ComplexType items, where a ComplexType instance encapsulates a SimpleType one (imagine a ComplexType::getSimpleType getter available).
While PropertyExtractingDelegatingItemWriter seems to be a solution at first sight, it's actually not compatible with my use case. I also looked at #4672, but they don't seem to help my use case either.
Taking inspiration from java.util.stream.Collectors.mapping(Function, Collector), I came up with a custom ItemWriter adapter for this purpose, statically imported as mapping(Function, ItemWriter), which allows writing a step definition like the following:
factory.get("step")
.<ComplexType, ComplexType>chunk(10)
.reader(/* an ItemReader<ComplexType> */)
.writer(mapping(ComplexType::getSimpleType, new SimpleTypeItemWriter()))
.build()I heavily simplified the example to give a feeling about the core idea. Arguably, that example can also be solved with a processor:
factory.get("step")
.<ComplexType, SimpleType>chunk(10)
.reader(/* an ItemReader<ComplexType> */)
.processor(/* an ItemProcess<ComplexType, SimpleType> */)
.writer(new SimpleTypeItemWriter())
.build()However, my real-life use case also involves a CompositeItemWriter where each delegate expects items of a different type, all encapsulated by ComplexType. Something like the following:
factory.get("step")
.<ComplexType, ComplexType>chunk(10)
.reader(/* an ItemReader<ComplexType> */)
.writer(new CompositeItemWriterBuilder<>()
.delegates(
mapping(ComplexType::getSimpleType, new SimpleTypeItemWriter())),
mapping(ComplexType::getAnotherType, new AnotherTypeItemWriter())),
mapping(ComplexType::getOneMoreType, new OneMoreTypeItemWriter())),
/* etc */
)
.build())
.build()Would Spring Batch be interested in introducing such an adapter, maybe as a static factory method under ItemWriter for better discoverability?
If yes, I would be happy to provide a PR for it.