apache/rocketmq · error · AuthorizationException
subscription group config is null.
Error message
subscription group config is null.
What it means
Thrown while iterating groupConfigList of an UPDATE_AND_CREATE_SUBSCRIPTIONGROUP_LIST request when an individual SubscriptionGroupConfig element is null. The builder immediately dereferences groupConfig.getGroupName(), so any null slot aborts context building with AuthorizationException before the CREATE permissions are evaluated.
Solutions
- Filter null elements from the list before building the request body.
- Make the conversion step fail loudly on invalid entries instead of emitting null.
- Add a unit assertion that every element of the outgoing list is non-null.
Example fix
// before
List<SubscriptionGroupConfig> list = parseAll(input);
body.setGroupConfigList(list);
// after
List<SubscriptionGroupConfig> list = parseAll(input).stream()
.filter(Objects::nonNull).collect(toList());
if (list.isEmpty()) { return; }
body.setGroupConfigList(list); Defensive patterns
Strategy: validation
Validate before calling
List<SubscriptionGroupConfig> clean = groupConfigList == null ? List.of()
: groupConfigList.stream().filter(Objects::nonNull).collect(toList());
if (clean.isEmpty()) { return; } Try / catch
try { admin.updateSubscriptionGroupList(body); }
catch (AuthorizationException e) {
if ("subscription group config is null.".equals(e.getMessage())) { filterNullsAndRetry(); return; }
throw e;
} Prevention
- Never allow null placeholders in request lists
- Validate list elements, not just the list itself
When it happens
Trigger: A body like {"groupConfigList":[null,...]} — null elements from a mapping step, placeholder-filled lists, or JSON produced by a non-Jackson encoder that emits nulls for absent entries.
Common situations: Pipelines converting YAML/CSV group definitions to SubscriptionGroupConfig where failed conversions become null; hand-built JSON arrays with literal null tokens.
Related errors
- subscription group is null.
- subscription group list is empty.
- topic config is null.
- is null.
- The body of acl is null
AI-assisted analysis of apache/rocketmq@293f588571 (2026-08-14).
Data as JSON: /api/errors/aa6e623cd1d082ea.
Report an issue: GitHub.
Appendix: source
Thrown at auth/src/main/java/org/apache/rocketmq/auth/authorization/builder/DefaultAuthorizationContextBuilder.java:516
SubscriptionGroupConfig subscriptionGroupConfig =
RemotingSerializable.decode(command.getBody(), SubscriptionGroupConfig.class);
if (subscriptionGroupConfig == null
|| StringUtils.isBlank(subscriptionGroupConfig.getGroupName())) {
throw new AuthorizationException("subscription group is null.");
}
result.add(DefaultAuthorizationContext.of(subject,
Resource.ofGroup(subscriptionGroupConfig.getGroupName()), Action.CREATE, sourceIp));
break;
case RequestCode.UPDATE_AND_CREATE_SUBSCRIPTIONGROUP_LIST:
SubscriptionGroupList subscriptionGroupList = decodeRequiredBody(
command, SubscriptionGroupList.class, "subscription group list");
if (CollectionUtils.isEmpty(subscriptionGroupList.getGroupConfigList())) {
throw new AuthorizationException("subscription group list is empty.");
}
Set<String> subscriptionGroupResources = new LinkedHashSet<>();
for (SubscriptionGroupConfig groupConfig : subscriptionGroupList.getGroupConfigList()) {
if (groupConfig == null) {
throw new AuthorizationException("subscription group config is null.");
}
addUniqueContext(result, subscriptionGroupResources, subject,
Resource.ofGroup(requireResource(groupConfig.getGroupName(), "consumer group")),
Action.CREATE, sourceIp);
}
break;
case RequestCode.UPDATE_AND_CREATE_STATIC_TOPIC:
CreateTopicRequestHeader createTopicRequestHeader =
command.decodeCommandCustomHeader(CreateTopicRequestHeader.class);
if (createTopicRequestHeader == null) {
throw new AuthorizationException("topic header is null.");
}
String staticTopic = requireResource(createTopicRequestHeader.getTopic(), "topic");
TopicQueueMappingDetail mappingDetail = decodeRequiredBody(
command, TopicQueueMappingDetail.class, "topic queue mapping");
if (!StringUtils.equals(
staticTopic, requireResource(mappingDetail.getTopic(), "mapping topic"))) {
throw new AuthorizationException("mapping topic does not match topic header.");View on GitHub (pinned to 293f588571)