diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemStreamSupport.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemStreamSupport.java index 4313c592a..6d72ffa4a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemStreamSupport.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemStreamSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2022 the original author or authors. + * Copyright 2006-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,6 +72,14 @@ public abstract class ItemStreamSupport implements ItemStream { this.setExecutionContextName(name); } + /** + * Get the name of the component + * @return the name of the component + */ + public String getName() { + return executionContextUserSupport.getName(); + } + protected void setExecutionContextName(String name) { executionContextUserSupport.setName(name); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/RepositoryItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/RepositoryItemReader.java index 21b03c4f8..cab3b1ee7 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/RepositoryItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/RepositoryItemReader.java @@ -37,6 +37,7 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.MethodInvoker; +import org.springframework.util.StringUtils; /** *

@@ -76,6 +77,7 @@ import org.springframework.util.MethodInvoker; * * @author Michael Minella * @author Antoine Kapps + * @author Mahmoud Ben Hassine * @since 2.2 */ public class RepositoryItemReader extends AbstractItemCountingItemStreamItemReader implements InitializingBean { @@ -121,7 +123,7 @@ public class RepositoryItemReader extends AbstractItemCountingItemStreamItemR } /** - * @param pageSize The number of items to retrieve per page. + * @param pageSize The number of items to retrieve per page. Must be greater than 0. */ public void setPageSize(int pageSize) { this.pageSize = pageSize; @@ -150,6 +152,10 @@ public class RepositoryItemReader extends AbstractItemCountingItemStreamItemR Assert.state(repository != null, "A PagingAndSortingRepository is required"); Assert.state(pageSize > 0, "Page size must be greater than 0"); Assert.state(sort != null, "A sort is required"); + Assert.state(this.methodName != null && !this.methodName.isEmpty(), "methodName is required."); + if (isSaveState()) { + Assert.state(StringUtils.hasText(getName()), "A name is required when saveState is set to true."); + } } @Nullable diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilder.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilder.java index 50098723f..e90a21f0e 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilder.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2022 the original author or authors. + * Copyright 2017-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,20 +16,14 @@ package org.springframework.batch.item.data.builder; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import org.springframework.batch.item.data.RepositoryItemReader; -import org.springframework.cglib.proxy.Enhancer; -import org.springframework.cglib.proxy.MethodInterceptor; -import org.springframework.cglib.proxy.MethodProxy; import org.springframework.data.domain.Sort; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; /** @@ -148,7 +142,7 @@ public class RepositoryItemReaderBuilder { /** * Establish the pageSize for the generated RepositoryItemReader. - * @param pageSize The number of items to retrieve per page. + * @param pageSize The number of items to retrieve per page. Must be greater than 0. * @return The current instance of the builder. * @see RepositoryItemReader#setPageSize(int) */ @@ -191,6 +185,7 @@ public class RepositoryItemReaderBuilder { public RepositoryItemReader build() { Assert.notNull(this.sorts, "sorts map is required."); Assert.notNull(this.repository, "repository is required."); + Assert.isTrue(this.pageSize > 0, "Page size must be greater than 0"); Assert.hasText(this.methodName, "methodName is required."); if (this.saveState) { Assert.state(StringUtils.hasText(this.name), "A name is required when saveState is set to true."); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/util/ExecutionContextUserSupport.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/util/ExecutionContextUserSupport.java index 389de9fc9..661ab42b8 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/util/ExecutionContextUserSupport.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/util/ExecutionContextUserSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 the original author or authors. + * Copyright 2006-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.springframework.util.Assert; * generating keys for {@link ExecutionContext} based on the name. * * @author Robert Kasanicky + * @author Mahmoud Ben Hassine */ public class ExecutionContextUserSupport { @@ -40,7 +41,7 @@ public class ExecutionContextUserSupport { /** * @return name used to uniquely identify this instance's entries in shared context. */ - protected String getName() { + public String getName() { return this.name; } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/RepositoryItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/RepositoryItemReaderTests.java index 3adefb0de..a11b513d5 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/RepositoryItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/RepositoryItemReaderTests.java @@ -93,6 +93,13 @@ class RepositoryItemReaderTests { reader.setRepository(repository); reader.setPageSize(1); reader.setSort(sorts); + assertThrows(IllegalStateException.class, reader::afterPropertiesSet); + + reader = new RepositoryItemReader<>(); + reader.setRepository(repository); + reader.setPageSize(1); + reader.setSort(sorts); + reader.setMethodName("findAll"); reader.afterPropertiesSet(); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilderTests.java index 72bb17e28..05a56d86c 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/builder/RepositoryItemReaderBuilderTests.java @@ -141,6 +141,13 @@ class RepositoryItemReaderBuilderTests { assertEquals("repository is required.", exception.getMessage()); } + @Test + void testInvalidPageSize() { + var builder = new RepositoryItemReaderBuilder<>().repository(repository).sorts(this.sorts).pageSize(-1); + Exception exception = assertThrows(IllegalArgumentException.class, builder::build); + assertEquals("Page size must be greater than 0", exception.getMessage()); + } + @Test void testArguments() throws Exception { List args = new ArrayList<>(3);