{"record":{"id":"409b4786cd4236f5","repo":"flowable/flowable-engine","slug":"cannot-create-an-event-throwing-event-listener-un","errorCode":null,"errorMessage":"Cannot create an event-throwing event-listener, unknown implementation type: \" + eventListener.getImplementationType()","messagePattern":"Cannot create an event-throwing event-listener, unknown implementation type: \" \\+ eventListener\\.getImplementationType\\(\\)","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java","lineNumber":191,"sourceCode":"        BaseDelegateEventListener result = null;\n        if (ImplementationType.IMPLEMENTATION_TYPE_THROW_SIGNAL_EVENT.equals(eventListener.getImplementationType())) {\n            result = new SignalThrowingEventListener();\n            ((SignalThrowingEventListener) result).setSignalName(eventListener.getImplementation());\n            ((SignalThrowingEventListener) result).setProcessInstanceScope(true);\n        } else if (ImplementationType.IMPLEMENTATION_TYPE_THROW_GLOBAL_SIGNAL_EVENT.equals(eventListener.getImplementationType())) {\n            result = new SignalThrowingEventListener();\n            ((SignalThrowingEventListener) result).setSignalName(eventListener.getImplementation());\n            ((SignalThrowingEventListener) result).setProcessInstanceScope(false);\n        } else if (ImplementationType.IMPLEMENTATION_TYPE_THROW_MESSAGE_EVENT.equals(eventListener.getImplementationType())) {\n            result = new MessageThrowingEventListener();\n            ((MessageThrowingEventListener) result).setMessageName(eventListener.getImplementation());\n        } else if (ImplementationType.IMPLEMENTATION_TYPE_THROW_ERROR_EVENT.equals(eventListener.getImplementationType())) {\n            result = new ErrorThrowingEventListener();\n            ((ErrorThrowingEventListener) result).setErrorCode(eventListener.getImplementation());\n        }\n\n        if (result == null) {\n            throw new FlowableIllegalArgumentException(\"Cannot create an event-throwing event-listener, unknown implementation type: \" + eventListener.getImplementationType());\n        }\n\n        result.setEntityClass(getEntityType(eventListener.getEntityType()));\n        return result;\n    }\n\n    @Override\n    public CustomPropertiesResolver createClassDelegateCustomPropertiesResolver(FlowableListener listener) {\n        return classDelegateFactory.create(listener.getCustomPropertiesResolverImplementation(), null);\n    }\n\n    @Override\n    public CustomPropertiesResolver createExpressionCustomPropertiesResolver(FlowableListener listener) {\n        return new ExpressionCustomPropertiesResolver(expressionManager.createExpression(listener.getCustomPropertiesResolverImplementation()));\n    }\n\n    @Override\n    public CustomPropertiesResolver createDelegateExpressionCustomPropertiesResolver(FlowableListener listener) {","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java#L173-L209","documentation":"createEventThrowingEventListener maps an event-listener's implementationType to a throwing event-listener class (signal, message, error, global signal). If the type matches none of the known ImplementationType constants, result stays null and the factory throws FlowableIllegalArgumentException. This means the BPMN declares an event-throwing listener with an implementation type the engine does not recognize.","triggerScenarios":"A <flowable:eventListener> whose implementationType attribute is misspelled, empty, or set to a non-event-throwing type (e.g. class/delegate-expression style values) while the factory is invoked for event-throwing listener creation.","commonSituations":"Typos in the implementationType attribute in BPMN XML; using an implementation type valid for regular listeners but not for event-throwing listeners; upgrades where an implementation type was removed or renamed.","solutions":["Set implementationType to one of the supported throwing types: throwSignalEvent, throwGlobalSignalEvent, throwMessageEvent, or throwErrorEvent.","Check the BPMN XML for typos or empty implementationType values on eventListener elements.","If the listener should invoke code rather than throw an event, use implementationType class or delegate-expression instead.","Consult the ImplementationType constants in your Flowable version to confirm valid values."],"exampleFix":"// before\n<flowable:eventListener events=\"JOB_EXECUTION_SUCCESS\" implementationType=\"throwSgnalEvent\" signalName=\"done\" />\n// after\n<flowable:eventListener events=\"JOB_EXECUTION_SUCCESS\" implementationType=\"throwSignalEvent\" signalName=\"done\" />","handlingStrategy":"validation","validationCode":"Set<String> valid = Set.of(ImplementationType.IMPLEMENTATION_TYPE_THROW_SIGNAL_EVENT,\n        ImplementationType.IMPLEMENTATION_TYPE_THROW_GLOBAL_SIGNAL_EVENT,\n        ImplementationType.IMPLEMENTATION_TYPE_THROW_MESSAGE_EVENT,\n        ImplementationType.IMPLEMENTATION_TYPE_THROW_ERROR_EVENT);\nif (!valid.contains(eventListener.getImplementationType())) {\n    throw new IllegalArgumentException(\"unsupported event-throwing implementationType: \"\n        + eventListener.getImplementationType());\n}","typeGuard":"boolean isThrowingType = type != null && (type.startsWith(\"throw-signal\")\n        || type.startsWith(\"throw-global-signal\")\n        || type.startsWith(\"throw-message\")\n        || type.startsWith(\"throw-error\"));","tryCatchPattern":"try {\n    deploymentBuilder.deploy();\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Cannot create an event-throwing event-listener\")) {\n        // correct the implementationType attribute and redeploy\n    } else { throw e; }\n}","preventionTips":["Only use the ImplementationType constants, never hand-typed strings.","Spell-check implementationType attributes in BPMN XML; values are case-sensitive.","Remember event-throwing listeners accept only the four throwing types, not class/expression."],"tags":["flowable","bpmn","event-listener","invalid-enum-value"],"backgroundTag":"invalid-enum-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"}