{"record":{"id":"16966d192c5a2104","repo":"alibaba/spring-cloud-alibaba","slug":"topic-must-not-be-empty","errorCode":null,"errorMessage":"topic must not be empty","messagePattern":"topic must not be empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQMessageConverterSupport.java","lineNumber":141,"sourceCode":"\t\t\t\tif (null == jsonObj) {\n\t\t\t\t\tthrow new RuntimeException(String.format(\n\t\t\t\t\t\t\t\"empty after conversion [messageConverter:%s,payloadClass:%s,payloadObj:%s]\",\n\t\t\t\t\t\t\tMESSAGE_CONVERTER.getClass(), payloadObj.getClass(),\n\t\t\t\t\t\t\tpayloadObj));\n\t\t\t\t}\n\t\t\t\tpayloads = jsonObj.getBytes(charset);\n\t\t\t}\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\tthrow new RuntimeException(\"convert to RocketMQ message failed.\", e);\n\t\t}\n\t\treturn getAndWrapMessage(topic, message.getHeaders(), payloads);\n\t}\n\n\tprivate static org.apache.rocketmq.common.message.Message getAndWrapMessage(\n\t\t\tString topic, MessageHeaders headers, byte[] payloads) {\n\t\tif (topic == null || topic.length() < 1) {\n\t\t\tthrow new IllegalArgumentException(\"topic must not be empty\");\n\t\t}\n\t\tif (payloads == null || payloads.length < 1) {\n\t\t\tthrow new IllegalArgumentException(\"payload must not be empty\");\n\t\t}\n\t\torg.apache.rocketmq.common.message.Message rocketMsg = new org.apache.rocketmq.common.message.Message(\n\t\t\t\ttopic, payloads);\n\t\tif (Objects.nonNull(headers) && !headers.isEmpty()) {\n\t\t\tObject tag = headers.getOrDefault(Headers.TAGS,\n\t\t\t\t\theaders.get(toRocketHeaderKey(Headers.TAGS)));\n\t\t\tif (!ObjectUtils.isEmpty(tag)) {\n\t\t\t\trocketMsg.setTags(String.valueOf(tag));\n\t\t\t}\n\n\t\t\tObject keys = headers.getOrDefault(Headers.KEYS,\n\t\t\t\t\theaders.get(toRocketHeaderKey(Headers.KEYS)));\n\t\t\tif (!ObjectUtils.isEmpty(keys)) {\n\t\t\t\trocketMsg.setKeys(keys.toString());\n\t\t\t}","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/alibaba/spring-cloud-alibaba/blob/115d5901102009492e05d5ec18c3f79cad4077d0/spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQMessageConverterSupport.java#L123-L159","documentation":"getAndWrapMessage throws IllegalArgumentException('topic must not be empty') if the resolved topic is null or blank. RocketMQ cannot address a message without a topic, so the binder refuses to construct the Message.","triggerScenarios":"convertMessage2MQ is called with a null/empty topic - e.g. destination.getName() is blank, or a programmatic send omits the topic.","commonSituations":"Outbound binding destination not configured (blank `destination`); the destination resolved to empty due to a placeholder that was never substituted; a programmatic producer send with no topic.","solutions":["Set `spring.cloud.stream.bindings.<output>.destination=<topic>`.","Resolve any unresolved `${...}` placeholders in the destination.","For programmatic sends, pass a non-blank topic."],"exampleFix":"// before\nspring:\n  cloud:\n    stream:\n      bindings:\n        out1:\n          destination: ${MISSING_TOPIC}   # unresolved -> blank -> [137]\n# after\nspring:\n  cloud:\n    stream:\n      bindings:\n        out1:\n          destination: order-events","handlingStrategy":"validation","validationCode":"// Reject blank topics before conversion.\nif (topic == null || topic.isBlank()) {\n    throw new IllegalArgumentException(\"RocketMQ topic is blank; set bindings.<output>.destination (avoids [137])\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set a non-blank destination for outbound bindings.","Provide defaults for placeholders to avoid blank resolution.","Validate topic at startup for programmatic producers."],"tags":["rocketmq","producer","config","topic"],"backgroundTag":null,"analyzedSha":"115d5901102009492e05d5ec18c3f79cad4077d0","analyzedAt":"2026-08-14T04:47:13.900Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}