apache/dubbo · error · IllegalStateException

The default protocol has not been initialized.

Error message

The default protocol has not been initialized.

What it means

Thrown by ServiceConfigBase.convertProtocolIdsToProtocols when no protocols are configured (protocolIds empty, protocols list empty) and the config manager has no default protocols to fall back to. Dubbo needs at least one protocol to export a service.

Source

Thrown at dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java:250

                setConfigCenter(provider.getConfigCenter());
            }
        }
    }

    protected void convertProviderIdToProvider() {
        if (provider == null && StringUtils.hasText(providerIds)) {
            provider = getModuleConfigManager()
                    .getProvider(providerIds)
                    .orElseThrow(() -> new IllegalStateException("Provider config not found: " + providerIds));
        }
    }

    protected void convertProtocolIdsToProtocols() {
        if (StringUtils.isEmpty(protocolIds)) {
            if (CollectionUtils.isEmpty(protocols)) {
                List<ProtocolConfig> protocolConfigs = getConfigManager().getDefaultProtocols();
                if (CollectionUtils.isEmpty(protocolConfigs)) {
                    throw new IllegalStateException("The default protocol has not been initialized.");
                }
                setProtocols(protocolConfigs);
            }
        } else {
            String[] idsArray = COMMA_SPLIT_PATTERN.split(protocolIds);
            Set<String> idsSet = new LinkedHashSet<>(Arrays.asList(idsArray));
            List<ProtocolConfig> tmpProtocols = new ArrayList<>();
            for (String id : idsSet) {
                Optional<ProtocolConfig> globalProtocol = getConfigManager().getProtocol(id);
                if (globalProtocol.isPresent()) {
                    tmpProtocols.add(globalProtocol.get());
                } else {
                    throw new IllegalStateException("Protocol not found: " + id);
                }
            }
            setProtocols(tmpProtocols);
        }
    }

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Define a ProtocolConfig (e.g. dubbo.protocol.name=dubbo, dubbo.protocol.port=20880) or register a ProtocolConfig bean.
  2. Set protocolIds on the ServiceConfig to reference an existing protocol id.
  3. Ensure the ProtocolConfig is registered before the service export/refresh runs.

Example fix

// before
// no ProtocolConfig defined anywhere
serviceConfig.export();

// after
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(20880);
configManager.addProtocol(protocol);
serviceConfig.export();
Defensive patterns

Strategy: validation

Validate before calling

// Ensure at least one protocol exists before export
if (configManager.getDefaultProtocols().isEmpty()
        && (serviceConfig.getProtocols() == null || serviceConfig.getProtocols().isEmpty())
        && (serviceConfig.getProtocolIds() == null || serviceConfig.getProtocolIds().isEmpty())) {
    throw new IllegalStateException(
        "No protocol configured; define dubbo.protocol.* or a ProtocolConfig bean");
}
serviceConfig.export();

Try / catch

try {
    serviceConfig.export();
} catch (IllegalStateException e) {
    if (e.getMessage().contains("default protocol has not been initialized")) {
        ProtocolConfig pc = new ProtocolConfig("dubbo", 20880);
        configManager.addProtocol(pc);
        serviceConfig.export();
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Exporting or refreshing a ServiceConfigBase where protocolIds is empty, protocols is empty, and getConfigManager().getDefaultProtocols() returns an empty list.

Common situations: No dubbo.protocol.* properties or ProtocolConfig bean defined. Protocol bean excluded by conditional configuration. Misconfigured application where the protocol registration was skipped. Multi-protocol setup where all ids were removed.

Related errors


AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14). Data as JSON: /api/errors/aacc5e0799fd5b1a. Report an issue: GitHub.