{"record":{"id":"b9b1c513c64dd7f9","repo":"flowable/flowable-engine","slug":"delegate-expression","errorCode":null,"errorMessage":"Delegate expression ","messagePattern":"Delegate expression ","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/PlanItemDelegateExpressionActivityBehavior.java","lineNumber":78,"sourceCode":"\n        } else if (delegate instanceof CmmnActivityBehavior) {\n            try {\n                ((CmmnActivityBehavior) delegate).execute(planItemInstanceEntity);\n            } catch (BusinessError fault) {\n                FaultPropagation.propagateFault(fault, commandContext, planItemInstanceEntity);\n            }\n\n        } else if (delegate instanceof PlanItemJavaDelegate) {\n            // PlanItemJavaDelegateActivityBehavior already catches CmmnFault internally\n            PlanItemJavaDelegateActivityBehavior behavior = new PlanItemJavaDelegateActivityBehavior((PlanItemJavaDelegate) delegate);\n            behavior.execute(planItemInstanceEntity);\n\n        } else if (delegate instanceof PlanItemFutureJavaDelegate) {\n            // PlanItemFutureJavaDelegateActivityBehavior already catches CmmnFault internally\n            PlanItemFutureJavaDelegateActivityBehavior behavior = new PlanItemFutureJavaDelegateActivityBehavior((PlanItemFutureJavaDelegate<?>) delegate);\n            behavior.execute(planItemInstanceEntity);\n        } else {\n            throw new FlowableIllegalArgumentException(\"Delegate expression \" + expression + \" did neither resolve to an implementation of \" +\n                    PlanItemActivityBehavior.class + \", \" + CmmnActivityBehavior.class + \", \" + PlanItemJavaDelegate.class + \" nor \"\n                    + PlanItemFutureJavaDelegate.class);\n        }\n    }\n\n    @Override\n    public void trigger(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity) {\n        Expression expressionObject = CommandContextUtil.getCmmnEngineConfiguration(commandContext).getExpressionManager().createExpression(expression);\n        Object delegate = DelegateExpressionUtil.resolveDelegateExpression(expressionObject, planItemInstanceEntity, fieldExtensions);\n        if (delegate instanceof CmmnTriggerableActivityBehavior) { // includes CmmnTriggerableActivityBehavior\n            ((CmmnTriggerableActivityBehavior) delegate).trigger(planItemInstanceEntity);\n\n        } else {\n            throw new FlowableIllegalArgumentException(\"Delegate expression \" + expression + \" did neither resolve to an implementation of \"\n                    + CmmnTriggerableActivityBehavior.class);\n        }\n    }\n","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/PlanItemDelegateExpressionActivityBehavior.java#L60-L96","documentation":"The plan item's delegateExpression resolved to an object implementing none of the four supported interfaces: PlanItemActivityBehavior, CmmnActivityBehavior, PlanItemJavaDelegate, or PlanItemFutureJavaDelegate. Flowable does not know how to execute the object, so it throws FlowableIllegalArgumentException listing the accepted interfaces.","triggerScenarios":"execute() of PlanItemDelegateExpressionActivityBehavior, when DelegateExpressionUtil.resolveDelegateExpression returns an object whose class implements none of the four supported interfaces.","commonSituations":"Implementing the plain Flowable (BPMN) JavaDelegate interface instead of PlanItemJavaDelegate in a CMMN case; referencing a bean that is a helper/service class, not a delegate; refactoring renamed the interface the class implements; Spring bean wired to the wrong component.","solutions":["Make the delegate class implement org.flowable.cmmn.api.delegate.PlanItemJavaDelegate (or PlanItemFutureJavaDelegate for async work).","If the class should control plan item lifecycle, implement PlanItemActivityBehavior; for generic behavior, CmmnActivityBehavior.","Verify the expression resolves to the intended bean (check the delegateExpression value and Spring context).","Catch FlowableIllegalArgumentException and log the resolved object's getClass() plus implemented interfaces to see what is missing."],"exampleFix":"// before\npublic class MyWorker implements org.flowable.engine.delegate.JavaDelegate { ... }\n// after\npublic class MyWorker implements org.flowable.cmmn.api.delegate.PlanItemJavaDelegate {\n    public Object execute(DelegatePlanItemInstance planItemInstance) { ... }\n}","handlingStrategy":"type-guard","validationCode":"Object delegate = applicationContext.getBean(beanName);\nboolean ok = delegate instanceof PlanItemActivityBehavior || delegate instanceof CmmnActivityBehavior\n    || delegate instanceof PlanItemJavaDelegate || delegate instanceof PlanItemFutureJavaDelegate;\nif (!ok) throw new IllegalArgumentException(beanName + \" implements none of the supported CMMN delegate interfaces\");","typeGuard":"boolean isValidCmmnDelegate(Object d) {\n    return d instanceof PlanItemActivityBehavior || d instanceof CmmnActivityBehavior\n        || d instanceof PlanItemJavaDelegate || d instanceof PlanItemFutureJavaDelegate;\n}","tryCatchPattern":"try {\n    // start case / execute plan item\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Delegate expression\")) {\n        log.error(\"Delegate for expression resolved to unsupported type: {}\", e.getMessage());\n    }\n}","preventionTips":["Use org.flowable.cmmn.api.delegate.PlanItemJavaDelegate, never the BPMN JavaDelegate, in CMMN cases","Assert bean types in Spring configuration tests before deployment","Keep delegate interfaces in one module to avoid accidental imports of the wrong package"],"tags":["cmmn","delegate-expression","unsupported-interface","configuration"],"backgroundTag":"unsupported-operation","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"}