{"record":{"id":"f5b535991f64c22f","repo":"flowable/flowable-engine","slug":"the-channel-json-tenant-detection-value-was-not-fo","errorCode":null,"errorMessage":"The channel json tenant detection value was not found for the channel model with key ${channelModel.key}. One of fixedValue, jsonPointerExpression, delegateExpression should be set.","messagePattern":"The channel json tenant detection value was not found for the channel model with key (.+?)\\. One of fixedValue, jsonPointerExpression, 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":179,"sourceCode":"            //noinspection unchecked\n            eventKeyDetector = resolveExpression(keyDetection.getDelegateExpression(), InboundEventKeyDetector.class);\n        } else {\n            throw new FlowableException(\n                \"The channel json key detection value was not found for the channel model with key \" + channelModel.getKey()\n                    + \". One of fixedValue, jsonField, jsonPointerExpression or 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.getJsonPointerExpression())) {\n                eventTenantDetector = new JsonPointerBasedInboundEventTenantDetector(channelEventTenantIdDetection.getJsonPointerExpression());\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 json tenant detection value was not found for the channel model with key \" + channelModel.getKey()\n                        + \". One of fixedValue, jsonPointerExpression, delegateExpression should be set.\");\n            }\n        }\n\n        return new DefaultInboundEventProcessingPipeline<>(eventRepositoryService, eventDeserializer, eventFilter,\n                eventKeyDetector, eventTenantDetector, eventPayloadExtractor, eventTransformer, engineConfiguration);\n    }\n\n    protected InboundEventProcessingPipeline createXmlEventProcessingPipeline(InboundChannelModel channelModel, \n            EventRepositoryService eventRepositoryService) {\n        \n        InboundEventDeserializer<Document> eventDeserializer;\n        if (StringUtils.isEmpty(channelModel.getDeserializerDelegateExpression())) {\n            eventDeserializer = new StringToXmlDocumentDeserializer();\n        } else {\n            //noinspection unchecked\n            eventDeserializer = resolveExpression(channelModel.getDeserializerDelegateExpression(), InboundEventDeserializer.class);","sourceCodeStart":161,"sourceCodeEnd":197,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/InboundChannelModelProcessor.java#L161-L197","documentation":"Thrown when a JSON inbound channel defines a ChannelEventTenantIdDetection block, but none of fixedValue, jsonPointerExpression, or delegateExpression is set. Tenant detection is optional, but once declared it must yield an InboundEventTenantDetector.","triggerScenarios":"Registering a JSON inbound channel with a non-null channelEventTenantIdDetection whose fixedValue, jsonPointerExpression and delegateExpression are all empty.","commonSituations":"Empty <tenantIdDetection/> element copied from another channel definition; wrong attribute names in the channel JSON so values do not bind; attempting JSON-field based tenant detection (jsonField is not supported here, only JSON pointer).","solutions":["Set one of tenantDetection.fixedValue, tenantDetection.jsonPointerExpression, or tenantDetection.delegateExpression.","For a single-tenant deployment you can simply remove the tenant detection block entirely instead of leaving it empty.","For tenant id inside the JSON payload use setJsonPointerExpression(\"/tenant\").","For a custom detector set setDelegateExpression(\"${myTenantDetector}\") pointing at an InboundEventTenantDetector bean."],"exampleFix":"// before\nChannelEventTenantIdDetection tenantDetection = new ChannelEventTenantIdDetection(); // empty\nchannelModel.setChannelEventTenantIdDetection(tenantDetection);\n\n// after\nChannelEventTenantIdDetection tenantDetection = new ChannelEventTenantIdDetection();\ntenantDetection.setJsonPointerExpression(\"/tenantId\");\nchannelModel.setChannelEventTenantIdDetection(tenantDetection);","handlingStrategy":"validation","validationCode":"ChannelEventTenantIdDetection td = channelModel.getChannelEventTenantIdDetection();\nif (td != null && isBlank(td.getFixedValue()) && isBlank(td.getJsonPointerExpression())\n        && isBlank(td.getDelegateExpression())) {\n    throw new IllegalArgumentException(\"Empty tenantIdDetection on channel \" + channelModel.getKey());\n}","typeGuard":"null","tryCatchPattern":"try {\n    eventRegistry.registerChannelModel(channelModel);\n} catch (FlowableException e) {\n    if (e.getMessage().contains(\"json tenant detection value was not found\")) {\n        logger.error(\"Set fixedValue/jsonPointerExpression/delegateExpression on channel {}\", channelModel.getKey());\n    }\n    throw e;\n}","preventionTips":["Omit tenant detection entirely for single-tenant deployments rather than leaving it empty","Use jsonPointerExpression (not jsonField) for JSON tenant detection","Keep tenant detection configuration in reviewed, versioned channel resources"],"tags":["flowable","event-registry","missing-config","multi-tenancy"],"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"}