flowable/flowable-engine · error · FlowableException
Error deserializing json info for process definition + proce
Error message
Error deserializing json info for process definition + processDefinition.getId()
What it means
addDefinitionInfoToCache reads the JSON blob stored for a ProcessDefinitionInfoEntity and deserializes it into a Jackson ObjectNode. If objectMapper.readTree fails (corrupt, truncated, or non-JSON bytes in the ACT_GE_BYTEARRAY row), Flowable wraps the failure in this FlowableException.
Source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/deployer/CachingAndArtifactsManager.java:96
ProcessEngineConfigurationImpl processEngineConfiguration, CommandContext commandContext) {
if (!processEngineConfiguration.isEnableProcessDefinitionInfoCache()) {
return;
}
DeploymentManager deploymentManager = processEngineConfiguration.getDeploymentManager();
ProcessDefinitionInfoEntityManager definitionInfoEntityManager = CommandContextUtil.getProcessDefinitionInfoEntityManager(commandContext);
ObjectMapper objectMapper = CommandContextUtil.getProcessEngineConfiguration(commandContext).getObjectMapper();
ProcessDefinitionInfoEntity definitionInfoEntity = definitionInfoEntityManager.findProcessDefinitionInfoByProcessDefinitionId(processDefinition.getId());
ObjectNode infoNode = null;
if (definitionInfoEntity != null && definitionInfoEntity.getInfoJsonId() != null) {
byte[] infoBytes = definitionInfoEntityManager.findInfoJsonById(definitionInfoEntity.getInfoJsonId());
if (infoBytes != null) {
try {
infoNode = (ObjectNode) objectMapper.readTree(infoBytes);
} catch (Exception e) {
throw new FlowableException("Error deserializing json info for process definition " + processDefinition.getId(), e);
}
}
}
ProcessDefinitionInfoCacheObject definitionCacheObject = new ProcessDefinitionInfoCacheObject();
if (definitionInfoEntity == null) {
definitionCacheObject.setRevision(0);
} else {
definitionCacheObject.setId(definitionInfoEntity.getId());
definitionCacheObject.setRevision(definitionInfoEntity.getRevision());
}
if (infoNode == null) {
infoNode = objectMapper.createObjectNode();
}
definitionCacheObject.setInfoNode(infoNode);
deploymentManager.getProcessDefinitionInfoCache().add(processDefinition.getId(), definitionCacheObject);View on GitHub (pinned to d6d39ce1c6)
Solutions
- Inspect the byte-array row referenced by infoJsonId and validate/repair the JSON content
- Delete or correct the corrupt ProcessDefinitionInfo/JSON rows and redeploy the process definition
- Restore the affected rows from a clean backup
- Check DB encoding/collation settings that may have mangled stored bytes
Example fix
-- before: inspect corrupt row SELECT bytes FROM ACT_GE_BYTEARRAY WHERE ID_ = '<infoJsonId>'; -- after: fix by redeploying after removing corrupt info rows DELETE FROM ACT_PROCDEF_INFO WHERE INFO_JSON_ID_ = '<infoJsonId>'; -- then redeploy the process definition
Defensive patterns
Strategy: validation
Validate before calling
byte[] infoBytes = /* fetched info JSON */;
try {
new ObjectMapper().readTree(infoBytes); // validate JSON parses before relying on cache path
} catch (IOException e) {
// repair/redeploy the definition info
} Try / catch
try {
deploy(...);
} catch (FlowableException e) {
if (e.getMessage().startsWith("Error deserializing json info")) {
// clean ACT_PROCDEF_INFO / byte-array rows and redeploy
}
} Prevention
- Never edit ACT_GE_BYTEARRAY rows manually
- Validate DB encoding/collation for byte-array storage
- Verify backups restore byte-array content intact across versions
When it happens
Trigger: Deploying/caching a process definition whose definition-info JSON row (fetched via findInfoJsonById) contains bytes that are not valid JSON. Called from updateCachingAndArtifacts during deployment.
Common situations: Database rows corrupted by manual edits or failed writes; encoding mismatches; someone modified the byte-array table directly; restoring DB backups across versions with changed JSON format.
Understand the failure class
Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.
Related errors
- Error deserializing json info for process definition %s
- Error reading app resource
- deployment '<deploymentId>' didn't put case definition '<cas
- Failed to serialize to a RestVariable instance
- request body could not be transformed to a RestVariable inst
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/85e3a7c6cc12310b.
Report an issue: GitHub.