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

  1. Ensure outbound messages carry a non-empty body.
  2. Filter/skip empty payloads upstream rather than sending them.
  3. 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

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


AI-assisted analysis of alibaba/spring-cloud-alibaba@115d590110 (2026-08-14). Data as JSON: /api/errors/8d063d299f1049ad. Report an issue: GitHub.