{"record":{"id":"62dfd86e7be20948","repo":"flowable/flowable-engine","slug":"the-channel-xml-tenant-detection-value-was-not-fou","errorCode":null,"errorMessage":"The channel xml tenant detection value was not found for the channel model with key ${channelModel.key}. One of fixedValue, xmlPathExpression (or xPathExpression), delegateExpression should be set.","messagePattern":"The channel xml tenant detection value was not found for the channel model with key (.+?)\\. One of fixedValue, xmlPathExpression \\(or xPathExpression\\), delegateExpression should be set\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/InboundChannelModelProcessor.java","lineNumber":249,"sourceCode":"        } else {\n            throw new FlowableException(\n                \"The channel xml key detection value was not found for the channel model with key \" + channelModel.getKey()\n                    + \". One of fixedValue, xmlPathExpression, delegateExpression should be set.\");\n        }\n\n        ChannelEventTenantIdDetection channelEventTenantIdDetection = channelModel.getChannelEventTenantIdDetection();\n        if (channelEventTenantIdDetection != null) {\n            if (StringUtils.isNotEmpty(channelEventTenantIdDetection.getFixedValue())) {\n                eventTenantDetector = new InboundEventStaticTenantDetector<>(channelEventTenantIdDetection.getFixedValue());\n            } else if (StringUtils.isNotEmpty(channelEventTenantIdDetection.getXmlXPathExpression())) {\n                eventTenantDetector = new XpathBasedInboundEventTenantDetector(channelEventTenantIdDetection.getXmlXPathExpression());\n            } else if (StringUtils.isNotEmpty(channelEventTenantIdDetection.getxPathExpression())) {\n                eventTenantDetector = new XpathBasedInboundEventTenantDetector(channelEventTenantIdDetection.getxPathExpression());\n            } else if (StringUtils.isNotEmpty(channelEventTenantIdDetection.getDelegateExpression())) {\n                //noinspection unchecked\n                eventTenantDetector = resolveExpression(channelEventTenantIdDetection.getDelegateExpression(), InboundEventTenantDetector.class);\n            } else {\n                throw new FlowableException(\n                    \"The channel xml tenant detection value was not found for the channel model with key \" + channelModel.getKey()\n                        + \". One of fixedValue, xmlPathExpression (or xPathExpression), delegateExpression should be set.\");\n            }\n        }\n\n        return new DefaultInboundEventProcessingPipeline<>(eventRepositoryService, eventDeserializer, eventFilter,\n            eventKeyDetector, eventTenantDetector, eventPayloadExtractor, eventTransformer, engineConfiguration);\n    }\n\n    protected <T> InboundEventPayloadExtractor<T> createInboundEventPayloadExtractor(InboundChannelModel channelModel,\n            InboundEventPayloadExtractor<T> payloadExtractorProvider) {\n        \n        InboundEventPayloadExtractor<T> modelEventPayloadExtractor;\n        if (StringUtils.isEmpty(channelModel.getPayloadExtractorDelegateExpression())) {\n            modelEventPayloadExtractor = payloadExtractorProvider;\n        } else {\n            //noinspection unchecked\n            modelEventPayloadExtractor = resolveExpression(channelModel.getPayloadExtractorDelegateExpression(), InboundEventPayloadExtractor.class);","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/InboundChannelModelProcessor.java#L231-L267","documentation":"Thrown when an XML inbound channel declares a ChannelEventTenantIdDetection but none of fixedValue, xmlPathExpression (or the legacy xPathExpression property), or delegateExpression is set. An empty tenant-detection block cannot produce an InboundEventTenantDetector.","triggerScenarios":"Registering an XML inbound channel with a non-null channelEventTenantIdDetection where getFixedValue, getXmlXPathExpression/getxPathExpression and getDelegateExpression are all empty.","commonSituations":"Property-name confusion between xPathExpression (legacy) and xmlPathExpression — setting the wrong one leaves both empty; empty <tenantIdDetection/> element; copying a JSON tenant detection (jsonPointer) into an XML channel where it is not read.","solutions":["Set one of tenantDetection.fixedValue, tenantDetection.xmlPathExpression (or legacy xPathExpression), or tenantDetection.delegateExpression.","If multi-tenancy is not used, remove the tenant detection block instead of leaving it empty.","Use an XPath such as setXmlXPathExpression(\"/event/@tenant\") to extract the tenant from the document.","Check the ChannelEventTenantIdDetection getter/setter naming (xPath vs xmlPath) used by your Flowable version and set the matching property."],"exampleFix":"// before\nChannelEventTenantIdDetection t = new ChannelEventTenantIdDetection();\nt.setJsonPointerExpression(\"/tenant\"); // not read by the XML pipeline\n\n// after\nChannelEventTenantIdDetection t = new ChannelEventTenantIdDetection();\nt.setXmlXPathExpression(\"/event/@tenant\");","handlingStrategy":"validation","validationCode":"ChannelEventTenantIdDetection td = channelModel.getChannelEventTenantIdDetection();\nif (td != null && isBlank(td.getFixedValue()) && isBlank(td.getXmlXPathExpression())\n        && isBlank(td.getxPathExpression()) && isBlank(td.getDelegateExpression())) {\n    throw new IllegalArgumentException(\"Empty tenantIdDetection on XML channel \" + channelModel.getKey());\n}","typeGuard":"null","tryCatchPattern":"try {\n    eventRegistry.registerChannelModel(channelModel);\n} catch (FlowableException e) {\n    if (e.getMessage().contains(\"xml tenant detection value was not found\")) {\n        logger.error(\"Set fixedValue/xmlPathExpression/xPathExpression/delegateExpression on channel {}\", channelModel.getKey());\n    }\n    throw e;\n}","preventionTips":["Check your Flowable version's property naming (xPathExpression legacy vs xmlPathExpression) and set the right one","Remove tenant detection blocks when multi-tenancy is unused","Validate tenant XPath expressions with sample documents"],"tags":["flowable","event-registry","missing-config","multi-tenancy","xml"],"backgroundTag":"empty-required-field","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"}