{"record":{"id":"01cc629e01f5f148","repo":"flowable/flowable-engine","slug":"no-sentry-found-for-reference-entrycriterion-get","errorCode":null,"errorMessage":"No sentry found for reference ${entryCriterion.getSentryRef()} of entry criterion ${entryCriterion.getId()}","messagePattern":"No sentry found for reference (.+?) of entry criterion (.+?)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/CmmnXmlConverter.java","lineNumber":613,"sourceCode":"            if (planItem.getItemControl().getParentCompletionRule() == null) {\n                ParentCompletionRule parentCompletionRule = new ParentCompletionRule();\n                parentCompletionRule.setType(ParentCompletionRule.IGNORE);\n\n                planItem.getItemControl().setParentCompletionRule(parentCompletionRule);\n            }\n        }\n    }\n\n    protected void resolveEntryCriteria(HasEntryCriteria hasEntryCriteria) {\n        for (Criterion entryCriterion : hasEntryCriteria.getEntryCriteria()) {\n            if (entryCriterion.getSentry() == null) {\n                // The timer event listener creates a fake sentry for the planItemStartTrigger.\n                // Therefore only look for a sentry if it hasn't been set yet\n                Sentry sentry = entryCriterion.getParent().findSentry(entryCriterion.getSentryRef());\n                if (sentry != null) {\n                    entryCriterion.setSentry(sentry);\n                } else {\n                    throw new FlowableException(\"No sentry found for reference \"\n                            + entryCriterion.getSentryRef() + \" of entry criterion \" + entryCriterion.getId());\n                }\n            }\n        }\n    }\n\n    protected void resolveExitCriteriaSentry(HasExitCriteria hasExitCriteria) {\n        for (Criterion exitCriterion : hasExitCriteria.getExitCriteria()) {\n            Sentry sentry = exitCriterion.getParent().findSentry(exitCriterion.getSentryRef());\n            if (sentry != null) {\n                exitCriterion.setSentry(sentry);\n            } else {\n                throw new FlowableException(\"No sentry found for reference \"\n                        + exitCriterion.getSentryRef() + \" of exit criterion \" + exitCriterion.getId());\n            }\n        }\n    }\n","sourceCodeStart":595,"sourceCodeEnd":631,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/CmmnXmlConverter.java#L595-L631","documentation":"During post-processing, each entry criterion's sentryRef must resolve to a <sentry> element declared in the same plan fragment/stage (its parent). If findSentry(sentryRef) returns null, this FlowableException is thrown: the entry criterion points to a sentry that does not exist.","triggerScenarios":"Deploying CMMN XML where <entryCriterion sentryRef=\"...\"> references a sentry id that was deleted, renamed, declared in a different stage/plan fragment, or never defined.","commonSituations":"Removing sentries while leaving criteria behind, refactoring case diagrams in external tools, copy-pasting plan items with their criteria but not their sentries, and typos in sentryRef.","solutions":["Ensure every entryCriterion's sentryRef equals the id of a <sentry> declared within the same plan fragment/stage","Re-add the missing <sentry> element or delete the orphan entry criterion","Re-verify the case in the Flowable modeler so references are kept consistent","Validate the file (XSD + conversion) before deployment to catch dangling refs early"],"exampleFix":"// before\n<entryCriterion sentryRef=\"sentryOld\"/> <!-- sentryOld removed -->\n// after\n<entryCriterion sentryRef=\"sentry1\"/> <!-- matches <sentry id=\"sentry1\"> in same stage -->","handlingStrategy":"validation","validationCode":"Set<String> sentryIds = collectIds(doc, \"sentry\");\nfor (Element c : doc.getElementsByTagName(\"entryCriterion\")) {\n    String ref = c.getAttribute(\"sentryRef\");\n    if (!sentryIds.contains(ref)) throw new DeploymentException(\"Unresolved entry sentryRef: \" + ref);\n}","typeGuard":null,"tryCatchPattern":"try {\n    repositoryService.createDeployment().addClasspathResource(\"case.cmmn.xml\").deploy();\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"No sentry found for reference\"))\n        log.error(\"Entry criterion with dangling sentryRef: \" + e.getMessage());\n    throw e;\n}","preventionTips":["Delete sentries together with their criteria; check references both ways","Declare sentries in the same stage/plan fragment as the criteria that use them","Validate case models with the Flowable modeler or CI dry-run deployment"],"tags":["cmmn","xml","model-validation","broken-reference"],"backgroundTag":"entity-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}