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
- Define a ProtocolConfig (e.g. dubbo.protocol.name=dubbo, dubbo.protocol.port=20880) or register a ProtocolConfig bean.
- Set protocolIds on the ServiceConfig to reference an existing protocol id.
- 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
- Always define at least one dubbo.protocol.* entry or ProtocolConfig bean.
- Validate protocol registration in a startup hook before any service export.
- Keep protocol config in a shared, always-loaded config source.
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
- ref not allow null!
- Protocol not found: <id>
- The interface class <interfaceClass> is not a interface!
- Local service for {getUrl().getServiceInterface()} has not b
- url missing protocol: "${fullURLStr}"
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/aacc5e0799fd5b1a.
Report an issue: GitHub.