alibaba/spring-cloud-alibaba · error · IllegalArgumentException
payload must not be empty
Error message
payload must not be empty
What it means
getAndWrapMessage throws IllegalArgumentException('payload must not be empty') when the payload byte array is null or zero-length. RocketMQ rejects empty message bodies, so the binder guards before constructing the Message.
Source
Thrown at spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQMessageConverterSupport.java:144
MESSAGE_CONVERTER.getClass(), payloadObj.getClass(),
payloadObj));
}
payloads = jsonObj.getBytes(charset);
}
}
catch (Exception e) {
throw new RuntimeException("convert to RocketMQ message failed.", e);
}
return getAndWrapMessage(topic, message.getHeaders(), payloads);
}
private static org.apache.rocketmq.common.message.Message getAndWrapMessage(
String topic, MessageHeaders headers, byte[] payloads) {
if (topic == null || topic.length() < 1) {
throw new IllegalArgumentException("topic must not be empty");
}
if (payloads == null || payloads.length < 1) {
throw new IllegalArgumentException("payload must not be empty");
}
org.apache.rocketmq.common.message.Message rocketMsg = new org.apache.rocketmq.common.message.Message(
topic, payloads);
if (Objects.nonNull(headers) && !headers.isEmpty()) {
Object tag = headers.getOrDefault(Headers.TAGS,
headers.get(toRocketHeaderKey(Headers.TAGS)));
if (!ObjectUtils.isEmpty(tag)) {
rocketMsg.setTags(String.valueOf(tag));
}
Object keys = headers.getOrDefault(Headers.KEYS,
headers.get(toRocketHeaderKey(Headers.KEYS)));
if (!ObjectUtils.isEmpty(keys)) {
rocketMsg.setKeys(keys.toString());
}
Object flagObj = headers.getOrDefault(Headers.FLAG,
headers.get(toRocketHeaderKey(Headers.FLAG)));
Object delayLevelObj = headers.getOrDefault(View on GitHub (pinned to 115d590110)
Solutions
- Ensure outbound messages carry a non-empty body.
- Filter/skip empty payloads upstream rather than sending them.
- For POJOs, confirm the converter produces non-empty JSON.
Example fix
// before
Message<String> m = MessageBuilder.withPayload("").build(); // -> [138]
// after
if (payload == null || (payload instanceof String s && s.isEmpty())
|| (payload instanceof byte[] b && b.length == 0)) {
return; // or throw a domain-specific error
}
Message<String> m = MessageBuilder.withPayload(payload).build(); Defensive patterns
Strategy: validation
Validate before calling
// Block empty bodies before they reach the converter.
boolean empty = payload == null
|| (payload instanceof String s && s.isEmpty())
|| (payload instanceof byte[] b && b.length == 0);
if (empty) {
throw new IllegalArgumentException("RocketMQ payload must be non-empty (avoids [138])");
} Type guard
// Type guard narrowing non-empty payloads.
static boolean isNonEmptyPayload(Object p) {
if (p == null) return false;
if (p instanceof String s) return !s.isEmpty();
if (p instanceof byte[] b) return b.length > 0;
return true; // let the converter decide
} Prevention
- Never send null/empty message bodies.
- Filter empty payloads in the upstream pipeline.
- Verify POJO JSON is non-empty before sending.
When it happens
Trigger: convertMessage2MQ resolves payloads to null/empty - e.g. an empty String payload, a byte[] of length 0, or a converted JSON that produced empty bytes.
Common situations: Sending an empty string or empty byte[]; a POJO whose JSON serialization is empty; a payload object whose JSON is blank; an upstream filter producing a null payload.
Related errors
- Binding for channel {destination.getName()} has been disable
- defaultMQProducer not initialized
- TransactionMQProducer must have a TransactionListener !!!
- message hasn't been sent,cause by : the SendType must be in
- empty after conversion [messageConverter:%s,payloadClass:%s,
AI-assisted analysis of alibaba/spring-cloud-alibaba@115d590110 (2026-08-14).
Data as JSON: /api/errors/8d063d299f1049ad.
Report an issue: GitHub.