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

  1. Inspect the byte-array row referenced by infoJsonId and validate/repair the JSON content
  2. Delete or correct the corrupt ProcessDefinitionInfo/JSON rows and redeploy the process definition
  3. Restore the affected rows from a clean backup
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/85e3a7c6cc12310b. Report an issue: GitHub.