Skip to content

JobStep JacksonExecutionContextStringSerializer error in Spring Batch 6.x #5192

@andrianov17

Description

@andrianov17

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions