spring-projects / spring-projects/spring-batch
Deserialization of JobParameters throws exception
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 3k
- Forks
- 2.5k
- Avg merge
- 6d 53m
- Merged PRs (30d)
- 3
Description
Bug description
When using a JobStep to call other jobs, Spring batch persists the associated JobParameters in the BATCH_STEP_EXECUTION_CONTEXT table as a serialized object.
JobParameters is Serializable but does not set its SerialVersionUID. If I attempt to load an old job execution for a composite job ( for example through JobExplorer.getJobExecution()) and the JobParameter class has changed (for example when I update the version of the Spring Batch dependency) then I get the following error:
Caused by: java.io.InvalidClassException: org.springframework.batch.core.JobParameters; local class incompatible: stream classdesc serialVersionUID = -2301555723671712749, local class serialVersionUID = 9157654800004870848
at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:597)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2051)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1898)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2224)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467)
at java.base/java.util.HashMap.readObject(HashMap.java:1552)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1100)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2423)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467)
at org.springframework.batch.core.repository.dao.DefaultExecutionContextSerializer.deserialize(DefaultExecutionContextSerializer.java:81)
... 193 common frames omitted
Environment
Spring Batch 5.0.5
Java 17
Postgres bitnami/postgresql:13.10.0
Steps to reproduce
Run a Job containing a JobStep (which calls another job) on Spring Batch version 5.0.1
Update to Spring batch 5.0.5
Load the job using JobExplorer.getJobExecution()
Expected behavior
The job execution should be loaded from the database
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the JobParameters class and the deserialization path through DefaultExecutionContextSerializer, then reproduce loading an older JobStep execution with JobExplorer.getJobExecution(). Done means executions persisted under Spring Batch 5.0.1 can be loaded after upgrading to 5.0.5 without the InvalidClassException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring
- Domain
- backend, database
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 55/100