{"record":{"id":"19678dac35b6ed69","repo":"flowable/flowable-engine","slug":"there-can-only-be-one-reactivation-listener-on-a-c","errorCode":null,"errorMessage":"There can only be one reactivation listener on a case model, not multiple ones. Use a start form on the listener, if there are several options on how to reactivate a case and use conditions to handle the different options on reactivation.","messagePattern":"There can only be one reactivation listener on a case model, not multiple ones\\. Use a start form on the listener, if there are several options on how to reactivate a case and use conditions to handle the different options on reactivation\\.","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/BaseCmmnXmlConverter.java","lineNumber":57,"sourceCode":"    public BaseElement convertToCmmnModel(XMLStreamReader xtr, ConversionHelper conversionHelper) {\n        BaseElement baseElement = convert(xtr, conversionHelper);\n        if (baseElement != null) {\n\n            baseElement.setId(xtr.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_ID));\n            CmmnXmlUtil.addXMLLocation(baseElement, xtr);\n\n            if (baseElement instanceof CmmnElement cmmnElement) {\n                conversionHelper.setCurrentCmmnElement(cmmnElement);\n            }\n\n            if (baseElement instanceof Criterion criterion) {\n                conversionHelper.getCmmnModel().addCriterion(criterion.getId(), criterion);\n            }\n\n            // the reactivate event listener is a very specific user event listener in need to be registered in the case model\n            if (baseElement instanceof ReactivateEventListener) {\n                if (conversionHelper.getCurrentCase().getReactivateEventListener() != null) {\n                    throw new FlowableIllegalArgumentException(\n                        \"There can only be one reactivation listener on a case model, not multiple ones. Use a start form on the listener, \"\n                        + \"if there are several options on how to reactivate a case and use conditions to handle the different options on reactivation.\");\n                }\n                conversionHelper.getCurrentCase().setReactivateEventListener((ReactivateEventListener) baseElement);\n            }\n        }\n        return baseElement;\n    }\n\n    protected abstract BaseElement convert(XMLStreamReader xtr, ConversionHelper conversionHelper);\n\n    protected void elementEnd(XMLStreamReader xtr, ConversionHelper conversionHelper) {\n        if (hasChildElements()) {\n            conversionHelper.removeCurrentCmmnElement();\n        }\n    }\n\n}","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/BaseCmmnXmlConverter.java#L39-L75","documentation":"During CMMN XML conversion, a ReactivateEventListener is registered on the Case model. The converter enforces at most one reactivation listener per case; a second one raises FlowableIllegalArgumentException with guidance to use start forms and conditions instead.","triggerScenarios":"Parsing/deploying a CMMN XML case file that contains two or more reactivate event listener elements within the same case model.","commonSituations":"Hand-editing or merging CMMN XML so the listener is duplicated; modeling multiple reactivation entry points in one case; copy-pasting a reactivate listener between cases/fragments.","solutions":["Keep exactly one ReactivateEventListener per case and delete duplicates","Add a start form on the single listener to choose a reactivation option","Use reactivation conditions on the listener to branch between options","Split into multiple cases if the reactivation logic genuinely requires separate models"],"exampleFix":"// before (XML)\n<reactivateEventListener id=\"react1\"/>\n<reactivateEventListener id=\"react2\"/>\n// after\n<reactivateEventListener id=\"react1\">\n  <extensionElements>\n    <flowable:formField .../>\n  </extensionElements>\n</reactivateEventListener>","handlingStrategy":"validation","validationCode":"int reactivateListeners = countElements(cmmnXml, \"reactivateEventListener\");\nif (reactivateListeners > 1) throw new IllegalArgumentException(\"Only one reactivateEventListener allowed per case\");","typeGuard":null,"tryCatchPattern":"try { cmmnXmlConverter.convertToCmmnModel(provider); } catch (FlowableIllegalArgumentException e) { throw new DeploymentException(\"Invalid case model: \" + e.getMessage(), e); }","preventionTips":["Model at most one ReactivateEventListener per case","Use the listener's start form plus conditions to offer multiple reactivation options","Run XSD + model validation before deploying CMMN XML","Watch for duplicated elements after XML merges or copy-paste"],"tags":["cmmn","xml-converter","validation","reactivation"],"backgroundTag":"invalid-argument-value","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"}