{"record":{"id":"34657ded7d787d89","repo":"alibaba/spring-cloud-alibaba","slug":"empty-after-conversion-messageconverter-s-payloa","errorCode":null,"errorMessage":"empty after conversion [messageConverter:%s,payloadClass:%s,payloadObj:%s]","messagePattern":"empty after conversion \\[messageConverter:(.+?),payloadClass:(.+?),payloadObj:(.+?)\\]","errorType":"exception","errorClass":"RuntimeException","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":124,"sourceCode":"\t}\n\n\tprivate static org.apache.rocketmq.common.message.Message doConvert(String topic,\n\t\t\tMessage<?> message) {\n\t\tCharset charset = Charset.defaultCharset();\n\t\tObject payloadObj = message.getPayload();\n\t\tbyte[] payloads;\n\t\ttry {\n\t\t\tif (payloadObj instanceof String payload) {\n\t\t\t\tpayloads = payload.getBytes(charset);\n\t\t\t}\n\t\t\telse if (payloadObj instanceof byte[] payload) {\n\t\t\t\tpayloads = payload;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tString jsonObj = (String) MESSAGE_CONVERTER.fromMessage(message,\n\t\t\t\t\t\tpayloadObj.getClass());\n\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}","sourceCodeStart":106,"sourceCodeEnd":142,"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#L106-L142","documentation":"In RocketMQMessageConverterSupport.convertMessage2MQ, for payloads that are neither String nor byte[], the configured Spring MessageConverter is asked to serialize the payload to JSON. If fromMessage returns null, the binder throws a RuntimeException detailing the converter class, payload class, and object - the payload could not be converted to a sendable form.","triggerScenarios":"An outbound message has a non-String/non-byte[] payload whose MessageConverter.fromMessage(...) returns null (no converter handles the type, or it produced empty output).","commonSituations":"No suitable MessageConverter for the payload type; contentType header missing/mismatched so the chosen converter bails; a custom converter returning null on edge payloads; a payload object the converter cannot serialize.","solutions":["Ensure a MessageConverter that handles your payload type is registered (e.g. Jackson for POJOs).","Set the correct `contentType` header (e.g. application/json).","Convert the payload to String/byte[] before sending if no converter fits.","Debug which MESSAGE_CONVERTER is selected and why it returns null."],"exampleFix":"// before\nMessage<String> ok = MessageBuilder.withPayload(\"hi\").build();\nMessage<MyPojo> bad = MessageBuilder.withPayload(pojo).build(); // no converter -> [135]\n// after\nMessage<MyPojo> good = MessageBuilder.withPayload(pojo)\n    .setHeader(\"contentType\", \"application/json\").build(); // Jackson converter handles it","handlingStrategy":"validation","validationCode":"// Pre-flight conversion check for unknown payload types.\nif (!(payloadObj instanceof String) && !(payloadObj instanceof byte[])) {\n    Object out = MESSAGE_CONVERTER.fromMessage(message, payloadObj.getClass());\n    if (out == null) {\n        throw new IllegalArgumentException(\n            \"No MessageConverter produces output for \" + payloadObj.getClass()\n            + \" - set contentType or register a converter (avoids [135])\");\n    }\n}","typeGuard":"// Type guard narrowing known-serializable payloads.\nstatic boolean isDirectlySerializable(Object p) {\n    return p instanceof String || p instanceof byte[];\n}","tryCatchPattern":null,"preventionTips":["Always set contentType for non-primitive payloads.","Register a converter that covers your domain types.","Pre-convert exotic payloads to String/byte[] when in doubt."],"tags":["rocketmq","producer","serialization","converter","config"],"backgroundTag":null,"analyzedSha":"115d5901102009492e05d5ec18c3f79cad4077d0","analyzedAt":"2026-08-14T04:47:13.900Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}