{"record":{"id":"53e463c036e1d99e","repo":"flowable/flowable-engine","slug":"the-channel-key-outboundchannelmodel-key-is-usi","errorCode":null,"errorMessage":"The channel key ${outboundChannelModel.key} is using expression deserialization, but pipelineDelegateExpression was not set.","messagePattern":"The channel key (.+?) is using expression deserialization, but pipelineDelegateExpression was not set\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/OutboundChannelModelProcessor.java","lineNumber":86,"sourceCode":"\n            if (StringUtils.isNotEmpty(outboundChannelModel.getPipelineDelegateExpression())) {\n                eventProcessingPipeline = resolveExpression(outboundChannelModel.getPipelineDelegateExpression(), OutboundEventProcessingPipeline.class);\n                \n            } else if (\"json\".equals(outboundChannelModel.getSerializerType())) {\n                OutboundEventSerializer eventSerializer = new EventPayloadToJsonStringSerializer(objectMapper);\n                eventProcessingPipeline = new DefaultOutboundEventProcessingPipeline(eventSerializer);\n                \n            } else if (\"xml\".equals(outboundChannelModel.getSerializerType())) {\n                OutboundEventSerializer eventSerializer = new EventPayloadToXmlStringSerializer();\n                eventProcessingPipeline = new DefaultOutboundEventProcessingPipeline(eventSerializer);\n                \n            } else if (\"expression\".equals(outboundChannelModel.getSerializerType())) {\n                if (StringUtils.isNotEmpty(outboundChannelModel.getSerializerDelegateExpression())) {\n                    OutboundEventSerializer outboundEventSerializer = resolveExpression(\n                            outboundChannelModel.getSerializerDelegateExpression(), OutboundEventSerializer.class);\n                    eventProcessingPipeline = new DefaultOutboundEventProcessingPipeline(outboundEventSerializer);\n                } else {\n                    throw new FlowableException(\n                        \"The channel key \" + outboundChannelModel.getKey()\n                            + \" is using expression deserialization, but pipelineDelegateExpression was not set.\");\n                }\n            }  else {\n                eventProcessingPipeline = null;\n            }\n\n            if (eventProcessingPipeline != null) {\n                outboundChannelModel.setOutboundEventProcessingPipeline(eventProcessingPipeline);\n            }\n\n        }\n    }\n\n    protected <T> T resolveExpression(String expression, Class<T> type) {\n        Object value = CommandContextUtil.getEventRegistryConfiguration().getExpressionManager()\n            .createExpression(expression)\n            .getValue(new VariableContainerWrapper(Collections.emptyMap()));","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/OutboundChannelModelProcessor.java#L68-L104","documentation":"Outbound channels with serializerType \"expression\" must supply a serializerDelegateExpression that resolves to an OutboundEventSerializer used by DefaultOutboundEventProcessingPipeline. When that expression is missing/empty, OutboundChannelModelProcessor.registerChannelModel throws this error because no pipeline can be built for serializing outbound event payloads.","triggerScenarios":"registerChannelModel on an outbound channel whose getSerializerType() equals \"expression\" while getSerializerDelegateExpression() is empty or null.","commonSituations":"Setting serializerType to \"expression\" in channel config but forgetting the delegate expression attribute; switching serializer type from \"json\" to \"expression\" without adding the bean reference; channel model builder call setting serializerExpression type without the expression value.","solutions":["Set the serializer delegate expression on the outbound channel model, e.g. .serializerDelegateExpression(\"${outboundEventSerializer}\") pointing at an OutboundEventSerializer bean","Alternatively change serializerType to a built-in type (e.g. \"json\") that does not require a delegate expression","Register an OutboundEventSerializer bean in the application context and confirm the expression string matches its bean name"],"exampleFix":"// before\nOutboundChannelModelBuilder b = eventRepositoryService.createOutboundChannelModelBuilder()\n    .key(\"out-channel\")\n    .serializerExpressionType(); // no delegate expression set\n// after\nOutboundChannelModelBuilder b = eventRepositoryService.createOutboundChannelModelBuilder()\n    .key(\"out-channel\")\n    .serializerExpressionType()\n    .serializerDelegateExpression(\"${jsonOutboundEventSerializer}\");","handlingStrategy":"validation","validationCode":"if (\"expression\".equals(outboundChannelModel.getSerializerType()) && isEmpty(outboundChannelModel.getSerializerDelegateExpression())) {\n    throw new IllegalArgumentException(\"Outbound channel '\" + outboundChannelModel.getKey() + \"' needs serializerDelegateExpression\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    registerChannelModel(...);\n} catch (FlowableException e) {\n    if (e.getMessage().contains(\"pipelineDelegateExpression was not set\")) {\n        // set serializerDelegateExpression or switch serializerType\n    } else { throw e; }\n}","preventionTips":["Whenever serializerType is \"expression\", always also set the delegate expression","Prefer built-in serializer types (json/xml) unless a custom serializer is needed","Keep an OutboundEventSerializer bean registered and documented in the app context"],"tags":["flowable","event-registry","outbound-channel","configuration"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}