{"record":{"id":"7e978f219ac853b9","repo":"flowable/flowable-engine","slug":"could-not-resolve-key-from-expression","errorCode":null,"errorMessage":"Could not resolve key from expression: ","messagePattern":"Could not resolve key from expression: ","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/EventRegistryEventListenerActivityBehaviour.java","lineNumber":74,"sourceCode":"\n    public EventRegistryEventListenerActivityBehaviour(Expression eventDefinitionKeyExpression) {\n        this.eventDefinitionKeyExpression = eventDefinitionKeyExpression;\n    }\n\n    @Override\n    public void execute(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity) {\n\n    }\n\n    protected String resolveEventDefinitionKey(PlanItemInstanceEntity planItemInstanceEntity) {\n        Object key = null;\n\n        if (eventDefinitionKeyExpression != null) {\n            key = eventDefinitionKeyExpression.getValue(planItemInstanceEntity);\n        }\n\n        if (key == null) {\n            throw new FlowableException(\"Could not resolve key from expression: \" + eventDefinitionKeyExpression + \" for \" + planItemInstanceEntity);\n        }\n\n        return key.toString();\n    }\n\n    @Override\n    public void trigger(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity) {\n        EventInstance eventInstance = (EventInstance) planItemInstanceEntity.getTransientVariable(EventConstants.EVENT_INSTANCE);\n        if (eventInstance != null) {\n            handleEventInstance(planItemInstanceEntity, eventInstance, commandContext);\n        }\n        \n        RepetitionRule repetitionRule = ExpressionUtil.getRepetitionRule(planItemInstanceEntity);\n        if (repetitionRule != null && ExpressionUtil.evaluateRepetitionRule(commandContext, planItemInstanceEntity, planItemInstanceEntity.getStagePlanItemInstanceEntity())) {\n            PlanItemInstanceEntity eventPlanItemInstanceEntity = PlanItemInstanceUtil.copyAndInsertPlanItemInstance(commandContext, planItemInstanceEntity, false, false);\n            CmmnEngineAgenda agenda = CommandContextUtil.getAgenda(commandContext);\n            agenda.planCreatePlanItemInstanceWithoutEvaluationOperation(eventPlanItemInstanceEntity);\n            agenda.planOccurPlanItemInstanceOperation(eventPlanItemInstanceEntity);","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/EventRegistryEventListenerActivityBehaviour.java#L56-L92","documentation":"EventRegistryEventListenerActivityBehaviour needs an event definition key to register an event registry event for the plan item. The key may come from the static eventDefinitionKey or an eventDefinitionKeyExpression. If both yield null, the engine cannot resolve which event definition to subscribe to and throws this FlowableException in resolveEventDefinitionKey.","triggerScenarios":"An event registry event listener plan item whose event definition key expression (e.g. ${eventKey}) evaluates to null when the plan item activates, and no static key is configured.","commonSituations":"Case variable holding the event key never set; expression typo; event definition key attribute left blank in the case model; variable set after the listener already activated.","solutions":["Set the event definition key variable in case scope before the listener plan item activates.","Configure a static eventDefinitionKey on the event listener element in the CMMN XML if the key is known at design time.","Fix the expression so it points at an existing, populated variable.","Ensure the event definition with that key is registered in the event registry (separate lookup error would otherwise follow)."],"exampleFix":"// before\n<eventRegistryEventListener eventDefinitionKeyExpression=\"${evtKey}\"/> ... case variable \"eventKey\" set -> typo -> null\n// after\ncaseRuntimeService.setVariable(caseInstanceId, \"evtKey\", \"myEventDefinition\");","handlingStrategy":"validation","validationCode":"Object key = caseVariables.get(\"eventKey\");\nif (key == null || key.toString().isBlank()) {\n    throw new IllegalArgumentException(\"eventKey variable must be set before event listener activates\");\n}","typeGuard":"if (keyValue instanceof String s && !s.isEmpty()) { /* usable as event definition key */ }","tryCatchPattern":"try {\n    caseRuntimeService.triggerPlanItemInstance(planItemId);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"Could not resolve key from expression\")) {\n        log.error(\"Event definition key expression unresolved on case {}\", caseInstanceId);\n    }\n    throw e;\n}","preventionTips":["Set event key variables before the listener plan item can activate","Use a static eventDefinitionKey when the key is fixed","Validate case model expressions resolve in an integration test"],"tags":["cmmn","event-registry","expression","null-value"],"backgroundTag":"missing-required-argument","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"}