Skip to content

Commit 3ca46a3

Browse files
committed
Refine ChunkOrientedStepBuilder to fix generics
Closes GH-5358 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent d8632a3 commit 3ca46a3

2 files changed

Lines changed: 15 additions & 13 deletions

File tree

spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/ChunkOrientedStepBuilder.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,18 @@
7171
* to provide common properties and methods for building chunk-oriented steps.
7272
*
7373
* @author Mahmoud Ben Hassine
74+
* @author Yanming Zhou
7475
* @since 6.0
7576
*/
7677
public class ChunkOrientedStepBuilder<I, O> extends StepBuilderHelper<ChunkOrientedStepBuilder<I, O>> {
7778

7879
private final int chunkSize;
7980

80-
private @Nullable ItemReader<I> reader;
81+
private @Nullable ItemReader<? extends I> reader;
8182

82-
private @Nullable ItemProcessor<I, O> processor;
83+
private @Nullable ItemProcessor<? super I, ? extends O> processor;
8384

84-
private @Nullable ItemWriter<O> writer;
85+
private @Nullable ItemWriter<? super O> writer;
8586

8687
private PlatformTransactionManager transactionManager = new ResourcelessTransactionManager();
8788

@@ -155,7 +156,7 @@ protected ChunkOrientedStepBuilder<I, O> self() {
155156
* @param reader an item reader
156157
* @return this for fluent chaining
157158
*/
158-
public ChunkOrientedStepBuilder<I, O> reader(ItemReader<I> reader) {
159+
public ChunkOrientedStepBuilder<I, O> reader(ItemReader<? extends I> reader) {
159160
this.reader = reader;
160161
return self();
161162
}
@@ -167,7 +168,7 @@ public ChunkOrientedStepBuilder<I, O> reader(ItemReader<I> reader) {
167168
* @param processor an item processor
168169
* @return this for fluent chaining
169170
*/
170-
public ChunkOrientedStepBuilder<I, O> processor(ItemProcessor<I, O> processor) {
171+
public ChunkOrientedStepBuilder<I, O> processor(ItemProcessor<? super I, ? extends O> processor) {
171172
this.processor = processor;
172173
return self();
173174
}
@@ -179,7 +180,7 @@ public ChunkOrientedStepBuilder<I, O> processor(ItemProcessor<I, O> processor) {
179180
* @param writer an item writer
180181
* @return this for fluent chaining
181182
*/
182-
public ChunkOrientedStepBuilder<I, O> writer(ItemWriter<O> writer) {
183+
public ChunkOrientedStepBuilder<I, O> writer(ItemWriter<? super O> writer) {
183184
this.writer = writer;
184185
return self();
185186
}
@@ -395,7 +396,6 @@ public ChunkOrientedStepBuilder<I, O> observationRegistry(ObservationRegistry ob
395396
return self();
396397
}
397398

398-
@SuppressWarnings("unchecked")
399399
public ChunkOrientedStep<I, O> build() {
400400
Assert.notNull(this.reader, "Item reader must not be null");
401401
Assert.notNull(this.writer, "Item writer must not be null");
@@ -457,6 +457,7 @@ public ChunkOrientedStep<I, O> build() {
457457
return chunkOrientedStep;
458458
}
459459

460+
@SuppressWarnings({ "rawtypes", "unchecked" })
460461
private void registerTypedListener(StepListener stepListener, ChunkOrientedStep<I, O> chunkOrientedStep) {
461462
if (stepListener instanceof ItemReadListener listener) {
462463
chunkOrientedStep.registerItemReadListener(listener);

spring-batch-core/src/main/java/org/springframework/batch/core/step/item/ChunkOrientedStep.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
* @author Mahmoud Ben Hassine
9191
* @author Andrey Litvitski
9292
* @author xeounxzxu
93+
* @author Yanming Zhou
9394
* @since 6.0
9495
*/
9596
public class ChunkOrientedStep<I, O> extends AbstractStep {
@@ -99,16 +100,16 @@ public class ChunkOrientedStep<I, O> extends AbstractStep {
99100
/*
100101
* Step Input / Output parameters
101102
*/
102-
private final ItemReader<I> itemReader;
103+
private final ItemReader<? extends I> itemReader;
103104

104105
private final CompositeItemReadListener<I> compositeItemReadListener = new CompositeItemReadListener<>();
105106

106107
@SuppressWarnings("unchecked")
107-
private ItemProcessor<I, O> itemProcessor = item -> (O) item;
108+
private ItemProcessor<? super I, ? extends O> itemProcessor = item -> (O) item;
108109

109110
private final CompositeItemProcessListener<I, O> compositeItemProcessListener = new CompositeItemProcessListener<>();
110111

111-
private final ItemWriter<O> itemWriter;
112+
private final ItemWriter<? super O> itemWriter;
112113

113114
private final CompositeItemWriteListener<O> compositeItemWriteListener = new CompositeItemWriteListener<>();
114115

@@ -167,8 +168,8 @@ public class ChunkOrientedStep<I, O> extends AbstractStep {
167168
* @param itemWriter the item writer to write items
168169
* @param jobRepository the job repository to use for this step
169170
*/
170-
public ChunkOrientedStep(String name, int chunkSize, ItemReader<I> itemReader, ItemWriter<O> itemWriter,
171-
JobRepository jobRepository) {
171+
public ChunkOrientedStep(String name, int chunkSize, ItemReader<? extends I> itemReader,
172+
ItemWriter<? super O> itemWriter, JobRepository jobRepository) {
172173
super(jobRepository);
173174
this.chunkSize = chunkSize;
174175
this.itemReader = itemReader;
@@ -180,7 +181,7 @@ public ChunkOrientedStep(String name, int chunkSize, ItemReader<I> itemReader, I
180181
* Set the item processor to use for processing items.
181182
* @param itemProcessor the item processor to set
182183
*/
183-
public void setItemProcessor(ItemProcessor<I, O> itemProcessor) {
184+
public void setItemProcessor(ItemProcessor<? super I, ? extends O> itemProcessor) {
184185
Assert.notNull(itemProcessor, "Item processor must not be null");
185186
this.itemProcessor = itemProcessor;
186187
}

0 commit comments

Comments
 (0)