diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java index ab8601b18c..e52d4dbde9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java @@ -58,6 +58,8 @@ * @author Glenn Renfro * @author Mahmoud Ben Hassine * @author Drummond Dawson + * @author Patrick Baumgartner + * @author François Martin * @since 4.0 * @see FlatFileItemReader */ @@ -459,6 +461,9 @@ else if (this.delimitedBuilder != null) { throw new IllegalStateException("No LineTokenizer implementation was provided."); } + Assert.state(this.targetType == null || this.fieldSetMapper == null, + "Either a TargetType or FieldSetMapper can be set, can't be both."); + if (this.targetType != null || StringUtils.hasText(this.prototypeBeanName)) { if (this.targetType != null && this.targetType.isRecord()) { RecordFieldSetMapper mapper = new RecordFieldSetMapper<>(this.targetType); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java index d1890ef383..e64ec68e5d 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java @@ -56,6 +56,8 @@ * @author Mahmoud Ben Hassine * @author Drummond Dawson * @author Glenn Renfro + * @author Patrick Baumgartner + * @author François Martin */ class FlatFileItemReaderBuilderTests { @@ -563,6 +565,17 @@ void testErrorMessageWhenNoLineTokenizerWasProvided() { } } + @Test + void testErrorWhenTargetTypeAndFieldSetMapperIsProvided() { + var builder = new FlatFileItemReaderBuilder().name("fooReader") + .resource(getResource("1;2;3")) + .lineTokenizer(line -> new DefaultFieldSet(line.split(";"))) + .targetType(Foo.class) + .fieldSetMapper(fieldSet -> new Foo()); + var exception = assertThrows(IllegalStateException.class, builder::build); + assertEquals("Either a TargetType or FieldSetMapper can be set, can't be both.", exception.getMessage()); + } + @Test void testSetupWithRecordTargetType() { // given