{"record":{"id":"85e3a7c6cc12310b","repo":"flowable/flowable-engine","slug":"error-deserializing-json-info-for-process-definiti","errorCode":null,"errorMessage":"Error deserializing json info for process definition + processDefinition.getId()","messagePattern":"Error deserializing json info for process definition \\+ processDefinition\\.getId\\(\\)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/deployer/CachingAndArtifactsManager.java","lineNumber":96,"sourceCode":"            ProcessEngineConfigurationImpl processEngineConfiguration, CommandContext commandContext) {\n\n        if (!processEngineConfiguration.isEnableProcessDefinitionInfoCache()) {\n            return;\n        }\n\n        DeploymentManager deploymentManager = processEngineConfiguration.getDeploymentManager();\n        ProcessDefinitionInfoEntityManager definitionInfoEntityManager = CommandContextUtil.getProcessDefinitionInfoEntityManager(commandContext);\n        ObjectMapper objectMapper = CommandContextUtil.getProcessEngineConfiguration(commandContext).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 FlowableException(\"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":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/deployer/CachingAndArtifactsManager.java#L78-L114","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"-- before: inspect corrupt row\nSELECT bytes FROM ACT_GE_BYTEARRAY WHERE ID_ = '<infoJsonId>';\n\n-- after: fix by redeploying after removing corrupt info rows\nDELETE FROM ACT_PROCDEF_INFO WHERE INFO_JSON_ID_ = '<infoJsonId>';\n-- then redeploy the process definition","handlingStrategy":"validation","validationCode":"byte[] infoBytes = /* fetched info JSON */;\ntry {\n    new ObjectMapper().readTree(infoBytes); // validate JSON parses before relying on cache path\n} catch (IOException e) {\n    // repair/redeploy the definition info\n}","typeGuard":null,"tryCatchPattern":"try {\n    deploy(...);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"Error deserializing json info\")) {\n        // clean ACT_PROCDEF_INFO / byte-array rows and redeploy\n    }\n}","preventionTips":["Never edit ACT_GE_BYTEARRAY rows manually","Validate DB encoding/collation for byte-array storage","Verify backups restore byte-array content intact across versions"],"tags":["json","deserialization","database","cache","deployment"],"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-14T05:17:10.506Z"}