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.

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)

Solutions

  1. Filter null elements from the list before building the request body.
  2. Make the conversion step fail loudly on invalid entries instead of emitting null.
  3. 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

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


AI-assisted analysis of apache/rocketmq@293f588571 (2026-08-14). Data as JSON: /api/errors/aa6e623cd1d082ea. Report an issue: GitHub.