From d92e28e6fdda088a1deab10d1cd02f60c7004280 Mon Sep 17 00:00:00 2001
From: Patrick Schwizer <schwizer.p@proton.me>
Date: Fri, 13 Jun 2025 15:56:19 +0200
Subject: [PATCH] Refactor JobKeyGenerator to use JobParameters instead of
 generic type

Signed-off-by: Patrick Schwizer <schwizer.p@proton.me>
---
 .../batch/core/job/DefaultJobKeyGenerator.java         |  2 +-
 .../batch/core/job/JobKeyGenerator.java                |  7 ++++---
 .../core/repository/dao/jdbc/JdbcJobInstanceDao.java   |  2 +-
 .../repository/dao/mongodb/MongoJobInstanceDao.java    |  4 ++--
 .../batch/core/DefaultJobKeyGeneratorTests.java        |  2 +-
 .../configuration/annotation/BatchRegistrarTests.java  |  7 ++++---
 .../explore/support/JobExplorerFactoryBeanTests.java   |  6 ++++--
 .../repository/dao/jdbc/CustomJobKeyGenerator.java     |  5 +++--
 .../support/JobRepositoryFactoryBeanTests.java         | 10 ++++------
 9 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/DefaultJobKeyGenerator.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/DefaultJobKeyGenerator.java
index 9956d25825..0bfafcb43c 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/DefaultJobKeyGenerator.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/DefaultJobKeyGenerator.java
@@ -36,7 +36,7 @@
  * @author Mahmoud Ben Hassine
  * @since 2.2
  */
-public class DefaultJobKeyGenerator implements JobKeyGenerator<JobParameters> {
+public class DefaultJobKeyGenerator implements JobKeyGenerator {
 
 	/**
 	 * Generates the job key to be used based on the {@link JobParameters} instance
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/JobKeyGenerator.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/JobKeyGenerator.java
index ccacaa048f..b5fcc38d11 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/JobKeyGenerator.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/JobKeyGenerator.java
@@ -15,6 +15,8 @@
  */
 package org.springframework.batch.core.job;
 
+import org.springframework.batch.core.job.parameters.JobParameters;
+
 /**
  * Strategy interface for the generation of the key used in identifying unique
  * {@link JobInstance} objects.
@@ -22,11 +24,10 @@
  * @author Michael Minella
  * @author Mahmoud Ben Hassine
  * @author Taeik Lim
- * @param <T> The type of the source data used to calculate the key.
  * @since 2.2
  */
 @FunctionalInterface
-public interface JobKeyGenerator<T> {
+public interface JobKeyGenerator {
 
 	/**
 	 * Method to generate the unique key used to identify a job instance.
@@ -34,6 +35,6 @@ public interface JobKeyGenerator<T> {
 	 * {@code null}).
 	 * @return a unique string identifying the job based on the information supplied.
 	 */
-	String generateKey(T source);
+	String generateKey(JobParameters source);
 
 }
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobInstanceDao.java
index 73cb1cfa99..6e39d21584 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobInstanceDao.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobInstanceDao.java
@@ -127,7 +127,7 @@ SELECT COUNT(*)
 
 	private DataFieldMaxValueIncrementer jobInstanceIncrementer;
 
-	private JobKeyGenerator<JobParameters> jobKeyGenerator = new DefaultJobKeyGenerator();
+	private JobKeyGenerator jobKeyGenerator = new DefaultJobKeyGenerator();
 
 	/**
 	 * In this JDBC implementation a job instance id is obtained by asking the
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/mongodb/MongoJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/mongodb/MongoJobInstanceDao.java
index a85948b6e5..2d742aa9e6 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/mongodb/MongoJobInstanceDao.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/mongodb/MongoJobInstanceDao.java
@@ -48,7 +48,7 @@ public class MongoJobInstanceDao implements JobInstanceDao {
 
 	private DataFieldMaxValueIncrementer jobInstanceIncrementer;
 
-	private JobKeyGenerator<JobParameters> jobKeyGenerator = new DefaultJobKeyGenerator();
+	private JobKeyGenerator jobKeyGenerator = new DefaultJobKeyGenerator();
 
 	private final JobInstanceConverter jobInstanceConverter = new JobInstanceConverter();
 
@@ -58,7 +58,7 @@ public MongoJobInstanceDao(MongoOperations mongoOperations) {
 		this.jobInstanceIncrementer = new MongoSequenceIncrementer(mongoOperations, SEQUENCE_NAME);
 	}
 
-	public void setJobKeyGenerator(JobKeyGenerator<JobParameters> jobKeyGenerator) {
+	public void setJobKeyGenerator(JobKeyGenerator jobKeyGenerator) {
 		this.jobKeyGenerator = jobKeyGenerator;
 	}
 
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/DefaultJobKeyGeneratorTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/DefaultJobKeyGeneratorTests.java
index 894de37608..f9a1335a00 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/DefaultJobKeyGeneratorTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/DefaultJobKeyGeneratorTests.java
@@ -27,7 +27,7 @@
 
 class DefaultJobKeyGeneratorTests {
 
-	private final JobKeyGenerator<JobParameters> jobKeyGenerator = new DefaultJobKeyGenerator();
+	private final JobKeyGenerator jobKeyGenerator = new DefaultJobKeyGenerator();
 
 	@Test
 	void testNullParameters() {
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java
index c9ab22621a..710efb01e3 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java
@@ -30,6 +30,7 @@
 import org.springframework.batch.core.converter.DefaultJobParametersConverter;
 import org.springframework.batch.core.converter.JobParametersConverter;
 import org.springframework.batch.core.converter.JsonJobParametersConverter;
+import org.springframework.batch.core.job.parameters.JobParameters;
 import org.springframework.batch.core.launch.JobLauncher;
 import org.springframework.batch.core.launch.JobOperator;
 import org.springframework.batch.core.repository.JobRepository;
@@ -291,14 +292,14 @@ public JdbcTransactionManager transactionManager(DataSource dataSource) {
 		}
 
 		@Bean
-		public JobKeyGenerator<Object> jobKeyGenerator() {
+		public JobKeyGenerator jobKeyGenerator() {
 			return new TestCustomJobKeyGenerator();
 		}
 
-		private static class TestCustomJobKeyGenerator implements JobKeyGenerator<Object> {
+		private static class TestCustomJobKeyGenerator implements JobKeyGenerator {
 
 			@Override
-			public String generateKey(Object source) {
+			public String generateKey(JobParameters source) {
 				return "1";
 			}
 
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBeanTests.java
index dafb4c8432..99d0de4db2 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBeanTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBeanTests.java
@@ -17,6 +17,7 @@
 
 import javax.sql.DataSource;
 
+import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -26,6 +27,7 @@
 import org.springframework.aop.framework.Advised;
 import org.springframework.batch.core.job.DefaultJobKeyGenerator;
 import org.springframework.batch.core.job.JobKeyGenerator;
+import org.springframework.batch.core.job.parameters.JobParameters;
 import org.springframework.batch.core.repository.explore.JobExplorer;
 import org.springframework.batch.core.repository.explore.support.JobExplorerFactoryBean;
 import org.springframework.jdbc.core.JdbcOperations;
@@ -148,10 +150,10 @@ public void testCustomJobKeyGenerator() throws Exception {
 		Assertions.assertEquals(CustomJobKeyGenerator.class, jobKeyGenerator.getClass());
 	}
 
-	static class CustomJobKeyGenerator implements JobKeyGenerator<String> {
+	static class CustomJobKeyGenerator implements JobKeyGenerator {
 
 		@Override
-		public String generateKey(String source) {
+		public @NotNull String generateKey(@NotNull JobParameters source) {
 			return "1";
 		}
 
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/CustomJobKeyGenerator.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/CustomJobKeyGenerator.java
index a279e057b5..be67ecfdc5 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/CustomJobKeyGenerator.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/CustomJobKeyGenerator.java
@@ -17,11 +17,12 @@
 
 import org.jetbrains.annotations.NotNull;
 import org.springframework.batch.core.job.JobKeyGenerator;
+import org.springframework.batch.core.job.parameters.JobParameters;
 
-public class CustomJobKeyGenerator implements JobKeyGenerator<String> {
+public class CustomJobKeyGenerator implements JobKeyGenerator {
 
 	@Override
-	public @NotNull String generateKey(@NotNull String source) {
+	public @NotNull String generateKey(@NotNull JobParameters source) {
 		return "1";
 	}
 
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java
index 645fb863e9..3149192b5e 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java
@@ -334,8 +334,7 @@ void testCustomLobType() throws Exception {
 	@Test
 	public void testDefaultJobKeyGenerator() throws Exception {
 		testCreateRepository();
-		@SuppressWarnings("rawtypes")
-		JobKeyGenerator<?> jobKeyGenerator = (JobKeyGenerator) ReflectionTestUtils.getField(factory, "jobKeyGenerator");
+		JobKeyGenerator jobKeyGenerator = (JobKeyGenerator) ReflectionTestUtils.getField(factory, "jobKeyGenerator");
 		assertEquals(DefaultJobKeyGenerator.class, jobKeyGenerator.getClass());
 	}
 
@@ -343,15 +342,14 @@ public void testDefaultJobKeyGenerator() throws Exception {
 	public void testCustomJobKeyGenerator() throws Exception {
 		factory.setJobKeyGenerator(new CustomJobKeyGenerator());
 		testCreateRepository();
-		@SuppressWarnings("rawtypes")
-		JobKeyGenerator<?> jobKeyGenerator = (JobKeyGenerator) ReflectionTestUtils.getField(factory, "jobKeyGenerator");
+		JobKeyGenerator jobKeyGenerator = (JobKeyGenerator) ReflectionTestUtils.getField(factory, "jobKeyGenerator");
 		assertEquals(CustomJobKeyGenerator.class, jobKeyGenerator.getClass());
 	}
 
-	static class CustomJobKeyGenerator implements JobKeyGenerator<String> {
+	static class CustomJobKeyGenerator implements JobKeyGenerator {
 
 		@Override
-		public String generateKey(String source) {
+		public String generateKey(JobParameters source) {
 			return "1";
 		}