{"record":{"id":"f6d8e8c10fa69e8f","repo":"flowable/flowable-engine","slug":"error-deserializing-json-info-for-process-definiti-f6d8e8","errorCode":null,"errorMessage":"Error deserializing json info for process definition %s","messagePattern":"Error deserializing json info for process definition (.+?)","errorType":"exception","errorClass":"ActivitiException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/deployer/BpmnDeployer.java","lineNumber":310,"sourceCode":"                                            ProcessEngineConfigurationImpl processEngineConfiguration, CommandContext commandContext) {\n\n        if (!processEngineConfiguration.isEnableProcessDefinitionInfoCache()) {\n            return;\n        }\n\n        DeploymentManager deploymentManager = processEngineConfiguration.getDeploymentManager();\n        ProcessDefinitionInfoEntityManager definitionInfoEntityManager = commandContext.getProcessDefinitionInfoEntityManager();\n        ObjectMapper objectMapper = commandContext.getProcessEngineConfiguration().getObjectMapper();\n        ProcessDefinitionInfoEntity definitionInfoEntity = definitionInfoEntityManager.findProcessDefinitionInfoByProcessDefinitionId(processDefinition.getId());\n\n        ObjectNode infoNode = null;\n        if (definitionInfoEntity != null && definitionInfoEntity.getInfoJsonId() != null) {\n            byte[] infoBytes = definitionInfoEntityManager.findInfoJsonById(definitionInfoEntity.getInfoJsonId());\n            if (infoBytes != null) {\n                try {\n                    infoNode = (ObjectNode) objectMapper.readTree(infoBytes);\n                } catch (Exception e) {\n                    throw new ActivitiException(\"Error deserializing json info for process definition \" + processDefinition.getId(), e);\n                }\n            }\n        }\n\n        ProcessDefinitionInfoCacheObject definitionCacheObject = new ProcessDefinitionInfoCacheObject();\n        if (definitionInfoEntity == null) {\n            definitionCacheObject.setRevision(0);\n        } else {\n            definitionCacheObject.setId(definitionInfoEntity.getId());\n            definitionCacheObject.setRevision(definitionInfoEntity.getRevision());\n        }\n\n        if (infoNode == null) {\n            infoNode = objectMapper.createObjectNode();\n        }\n        definitionCacheObject.setInfoNode(infoNode);\n\n        deploymentManager.getProcessDefinitionInfoCache().add(processDefinition.getId(), definitionCacheObject);","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/deployer/BpmnDeployer.java#L292-L328","documentation":"When caching a process definition, the deployer loads the stored definition-info JSON blob (ProcessDefinitionInfoEntity.infoJsonId) from the database and deserializes it with Jackson's ObjectMapper into an ObjectNode. If the stored bytes are not valid JSON, an ActivitiException wrapping the parse failure is thrown.","triggerScenarios":"addDefinitionInfoToCache (via addProcessDefinitionToCache) when definitionInfoEntityManager.findInfoJsonById returns bytes that objectMapper.readTree cannot parse.","commonSituations":"Corrupted or manually edited rows in ACT_PROCDEF_INFO / ACT_GE_BYTEARRAY; data restored from backups with truncation; older engine versions writing an incompatible JSON format.","solutions":["Fix or regenerate the JSON in ACT_GE_BYTEARRAY (delete the definition info entity so it is regenerated on next deployment)","Redeploy the process definition to rewrite the definition info JSON","Validate the stored JSON bytes with a JSON parser to identify the corruption"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"byte[] info = definitionInfoEntityManager.findInfoJsonById(id);\ntry { new ObjectMapper().readTree(info); } catch (Exception e) { /* corrupted: regenerate definition info */ }","typeGuard":null,"tryCatchPattern":"try {\n    processEngine.getProcessEngineConfiguration()... ;\n} catch (org.activiti.engine.ActivitiException e) {\n    if (e.getMessage().contains(\"Error deserializing json info\")) {\n        // delete/regenerate the process definition info and redeploy\n    }\n}","preventionTips":["Never hand-edit ACT_GE_BYTEARRAY JSON rows","Redeploy the definition after upgrading engine versions to refresh definition info","Back up and restore both ACT_PROCDEF_INFO and ACT_GE_BYTEARRAY together"],"tags":["json","database","deserialization","cache"],"backgroundTag":"json-unmarshal-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}