{"record":{"id":"37997a1611d5825f","repo":"flowable/flowable-engine","slug":"channel-definition-channeldefinition-cannot-reso-37997a","errorCode":null,"errorMessage":"Channel definition <channelDefinition> cannot resolve <resolvedValue> as a String[] or a String or a Queue","messagePattern":"Channel definition <channelDefinition> cannot resolve <resolvedValue> as a String\\[\\] or a String or a Queue","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry-spring/src/main/java/org/flowable/eventregistry/spring/rabbit/RabbitChannelDefinitionProcessor.java","lineNumber":202,"sourceCode":"        return resultQueues.toArray(new String[0]);\n    }\n\n    protected void resolveQueues(Object resolvedValue, List<String> result, RabbitInboundChannelModel channelDefinition) {\n        Object resolvedValueToUse = resolvedValue;\n        if (resolvedValueToUse instanceof String[]) {\n            resolvedValueToUse = Arrays.asList((String[]) resolvedValueToUse);\n        }\n\n        if (resolvedValueToUse instanceof String) {\n            result.add((String) resolvedValueToUse);\n        } else if (resolvedValueToUse instanceof Queue) {\n            result.add(((Queue) resolvedValueToUse).getName());\n        } else if (resolvedValueToUse instanceof Iterable) {\n            for (Object object : (Iterable<?>) resolvedValueToUse) {\n                resolveQueues(object, result, channelDefinition);\n            }\n        } else {\n            throw new IllegalArgumentException(\n                \"Channel definition \" + channelDefinition + \" cannot resolve \" + resolvedValue + \" as a String[] or a String or a Queue\");\n        }\n    }\n\n    protected Integer resolvePriority(RabbitInboundChannelModel channelDefinition) {\n        String priority = resolve(channelDefinition.getPriority());\n        if (StringUtils.hasText(priority)) {\n            try {\n                return Integer.valueOf(priority);\n            } catch (NumberFormatException ex) {\n                throw new IllegalArgumentException(\"Invalid priority value for \" +\n                    channelDefinition + \" (must be an integer)\", ex);\n            }\n        } else {\n            return null;\n        }\n    }\n","sourceCodeStart":184,"sourceCodeEnd":220,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry-spring/src/main/java/org/flowable/eventregistry/spring/rabbit/RabbitChannelDefinitionProcessor.java#L184-L220","documentation":"Each queue entry in the channel definition is resolved (possibly via SpEL) and must resolve to a String, a String array/iterable, or an org.springframework.amqp.core.Queue. Any other resolved type makes resolveQueues throw this IllegalArgumentException because the endpoint cannot derive queue names from it.","triggerScenarios":"A queue expression resolves to an unsupported type, e.g. a Map, Integer, Boolean, or arbitrary bean, when createRabbitListenerEndpoint processes the queues of an inbound Rabbit channel definition.","commonSituations":"SpEL pointing at the wrong bean or a Map of queue properties instead of names; placeholder resolving to a Number; typo causing resolution to fall through to an unexpected object; nested list of non-String elements.","solutions":["Change the expression so it resolves to a queue name String (or list of Strings)","If referencing a bean, reference a Queue bean or a String[]/List<String> bean","Print/log the resolved value's class to identify the wrong type","Fix typos in property keys that cause fallback to unintended values"],"exampleFix":"// before\n\"queues\": \"${queueProps}\"  // resolves to Map<String,String>\n// after\n\"queues\": \"${queueNames}\"  // resolves to List<String> or String[]","handlingStrategy":"validation","validationCode":"Object resolved = resolveExpression(queueExpr);\nif (!(resolved instanceof String) && !(resolved instanceof String[]) && !(resolved instanceof Queue) && !(resolved instanceof Iterable)) {\n    throw new IllegalArgumentException(\"Queue expression must resolve to String/String[]/Queue/Iterable, got \" + resolved.getClass());\n}","typeGuard":"boolean isResolvableQueueValue(Object v) {\n    return v instanceof String || v instanceof String[] || v instanceof Queue || v instanceof Iterable;\n}","tryCatchPattern":"try {\n    processor.process(definition);\n} catch (IllegalArgumentException ex) {\n    if (ex.getMessage().contains(\"cannot resolve\")) {\n        log.error(\"Queue expression resolves to unsupported type: {}\", ex.getMessage());\n    }\n    throw ex;\n}","preventionTips":["Point queue expressions only at String, String[], List<String>, or Queue beans","Log resolved types during development to catch mismatches early","Avoid loosely typed config (Maps) in queue positions"],"tags":["rabbitmq","spring","spel","configuration"],"backgroundTag":"unsupported-dtype","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"}