{"record":{"id":"0374652b7c4bfbfe","repo":"flowable/flowable-engine","slug":"cannot-trigger-a-plan-item-which-activity-behavior","errorCode":null,"errorMessage":"Cannot trigger a plan item which activity behavior does not implement the ${behaviorClass} interface in ${planItemInstanceEntity}","messagePattern":"Cannot trigger a plan item which activity behavior does not implement the (.+?) interface in (.+?)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/agenda/operation/TriggerPlanItemInstanceOperation.java","lineNumber":56,"sourceCode":"                && planItemInstanceEntity.getPlanItem().getPlanItemDefinition() instanceof EventListener\n                && PlanItemInstanceState.AVAILABLE.equals(planItemInstanceEntity.getState()))){\n            \n            executeTrigger();\n\n        } else {\n            if (planItemInstanceEntity.getPlanItem() != null && planItemInstanceEntity.getPlanItem().getPlanItemDefinition() instanceof EventListener){\n                throw new FlowableIllegalStateException(\"Can only trigger an event listener plan item that is in the AVAILABLE state\");\n            } else {\n                throw new FlowableIllegalStateException(\"Can only trigger a plan item that is in the ACTIVE state\");\n            }\n\n        }\n    }\n\n    protected void executeTrigger() {\n        Object behaviorObject = planItemInstanceEntity.getPlanItem().getBehavior();\n        if (!(behaviorObject instanceof CmmnTriggerableActivityBehavior)) {\n            throw new FlowableException(\"Cannot trigger a plan item which activity behavior does not implement the \" \n                    + CmmnTriggerableActivityBehavior.class + \" interface in \" + planItemInstanceEntity);\n        }\n        CmmnTriggerableActivityBehavior behavior = (CmmnTriggerableActivityBehavior) planItemInstanceEntity.getPlanItem().getBehavior();\n        if (behavior instanceof CoreCmmnTriggerableActivityBehavior) {\n            ((CoreCmmnTriggerableActivityBehavior) behavior).trigger(commandContext, planItemInstanceEntity);\n        } else {\n            behavior.trigger(planItemInstanceEntity);\n        }\n    }\n    \n    @Override\n    public String toString() {\n        PlanItem planItem = planItemInstanceEntity.getPlanItem();\n        StringBuilder stringBuilder = new StringBuilder();\n        stringBuilder.append(\"[Trigger PlanItem] \");\n        stringBuilder.append(planItem);\n        return stringBuilder.toString();\n    }","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/agenda/operation/TriggerPlanItemInstanceOperation.java#L38-L74","documentation":"executeTrigger() casts the plan item's behavior to CmmnTriggerableActivityBehavior before delegating the trigger. If the behavior object attached to the plan item does not implement that interface, it cannot be triggered and Flowable throws this error. This is an internal wiring invariant of the plan item's activity behavior.","triggerScenarios":"Triggering a plan item whose configured behavior (from its PlanItemDefinition / custom PlanItemHandler) is a non-triggerable CmmnActivityBehavior, e.g. a custom behavior registered via CmmnEngineConfiguration that implements only the non-triggerable interface.","commonSituations":"Custom PlanItemHandler returning a behavior that implements CmmnActivityBehavior but not CmmnTriggerableActivityBehavior; engine upgrades where behavior class hierarchies changed; misconfiguration of a plan item definition in the case model.","solutions":["Make the custom activity behavior implement CmmnTriggerableActivityBehavior (and CoreCmmnTriggerableActivityBehavior if it needs the commandContext).","Verify the PlanItemHandler/behavior registration in the CmmnEngineConfiguration maps the definition type to the correct triggerable behavior class.","Check the plan item definition in the CMMN XML: only definition types with triggerable behaviors can be programmatically triggered.","Redeploy the case definition after fixing the model/behavior."],"exampleFix":"// before\npublic class MyBehavior implements CmmnActivityBehavior {\n    public void execute(PlanItemInstanceEntity e) { ... }\n}\n// after\npublic class MyBehavior implements CoreCmmnTriggerableActivityBehavior {\n    public void execute(PlanItemInstanceEntity e) { ... }\n    public void trigger(CommandContext ctx, PlanItemInstanceEntity e) { ... }\n}","handlingStrategy":"type-guard","validationCode":"// Register only behaviors implementing CmmnTriggerableActivityBehavior in your PlanItemHandler\nboolean triggerable = CmmnTriggerableActivityBehavior.class\n    .isInstance(planItem.getBehavior());","typeGuard":"if (behavior instanceof CmmnTriggerableActivityBehavior) {\n    ((CmmnTriggerableActivityBehavior) behavior).trigger(...);\n}","tryCatchPattern":"try {\n    cmmnRuntimeService.triggerPlanItemInstance(id);\n} catch (FlowableException e) {\n    // behavior wiring bug — fix the PlanItemHandler registration\n}","preventionTips":["Custom behaviors must implement CmmnTriggerableActivityBehavior","Unit-test every custom PlanItemHandler registration","Re-check behavior classes after Flowable upgrades","Verify plan item definition types map to triggerable behaviors"],"tags":["cmmn","behavior","plan-item","class-cast"],"backgroundTag":"internal-invariant-violation","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"}