-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Description
Bug description
After upgrade to Spring Batch 6.0.1 and using new org.springframework.batch.core.repository.dao.JacksonExecutionContextStringSerializer, JobStep fails upon step execution context deserialization:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Problem deserializing 'setterless' property ("identifyingParameters"): no way to handle typed deser with setterless yet
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 935] (through reference chain: java.util.HashMap["org.springframework.batch.core.step.job.JobStep.JOB_PARAMETERS"]->org.springframework.batch.core.job.parameters.JobParameters["identifyingParameters"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1943)
at com.fasterxml.jackson.databind.deser.impl.SetterlessProperty.deserializeAndSet(SetterlessProperty.java:117)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:265)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:466)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1499)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:340)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
This happens because as opposed to Jackson2ExecutionContextStringSerializer, JacksonExecutionContextStringSerializer serializes every org.springframework.batch.core.job.parameters.JobParameters public getter, including isEmpty() and getIdentifyingParameters().
This is serialized step execution context:
{
"org.springframework.batch.core.step.job.JobStep.JOB_PARAMETERS": [
"org.springframework.batch.core.job.parameters.JobParameters",
{
"parameters": [
"java.util.Collections$UnmodifiableSet",
[
{
"name": "queueItemId",
"value": "280941",
"type": "java.lang.String",
"identifying": false
},
{
"name": "execType",
"value": "MANUAL",
"type": "java.lang.String",
"identifying": false
},
{
"name": "jsr_batch_run_id",
"value": [
"java.lang.Long",
3580
],
"type": "java.lang.Long",
"identifying": true
},
{
"name": "user",
"value": "system",
"type": "java.lang.String",
"identifying": false
}
]
],
"empty": false,
"identifyingParameters": [
"java.util.ImmutableCollections$SetN",
[
{
"name": "jsr_batch_run_id",
"value": [
"java.lang.Long",
3580
],
"type": "java.lang.Long",
"identifying": true
}
]
]
}
],
"batch.version": "6.0.1",
"batch.stepType": "..."
}
Please also note that as opposed to Spring Batch 5.x, serialized context doesn't have @Class fields:
{
"@class": "java.util.HashMap",
"childJobExecId": [
"java.lang.Long",
3480
],
"org.springframework.batch.core.step.job.JobStep.JOB_PARAMETERS": {
"@class": "org.springframework.batch.core.JobParameters",
"parameters": {
"@class": "java.util.Collections$UnmodifiableMap",
"queueItemId": {
...
"batch.version": "5.2.3"
}
Environment
Spring Batch 6.0.1, SQL Server 2022
Steps to reproduce
- Have a job with JobStep
- Run the job with some parameters
- Get Spring Batch job execution by job exec iD for just executed job - exception is thrown
Expected behavior
When job execution is get by job execution ID, all step execution contexts are deserialized with no exceptions.
Minimal Complete Reproducible example
The example is pretty basic - see Steps to reproduce above