apache/dubbo · error · IllegalStateException
Provider is not initialized
Error message
Provider is not initialized
What it means
Thrown by ServiceConfigBase.getMetaData when the config has been refreshed but its ProviderConfig is still null. The provider should be resolved during preProcessRefresh(); its absence after refresh indicates an inconsistent lifecycle state.
Source
Thrown at dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java:203
.orElseThrow(() -> new IllegalStateException("Default provider is not initialized"));
}
// try set properties from `dubbo.service` if not set in current config
refreshWithPrefixes(super.getPrefixes(), ConfigMode.OVERRIDE_IF_ABSENT);
}
@Override
@Transient
public Map<String, String> getMetaData() {
return getMetaData(null);
}
@Override
public Map<String, String> getMetaData(String prefix) {
Map<String, String> metaData = new HashMap<>();
ProviderConfig provider = this.getProvider();
// provider should be initialized at preProcessRefresh()
if (isRefreshed() && provider == null) {
throw new IllegalStateException("Provider is not initialized");
}
// use provider attributes as default value
appendAttributes(metaData, provider, prefix);
// Finally, put the service's attributes, overriding previous attributes
appendAttributes(metaData, this, prefix);
return metaData;
}
protected void checkProtocol() {
if (provider != null && notHasSelfProtocolProperty()) {
setProtocols(provider.getProtocols());
setProtocolIds(provider.getProtocolIds());
}
convertProtocolIdsToProtocols();
}
private boolean notHasSelfProtocolProperty() {
return CollectionUtils.isEmpty(protocols) && StringUtils.isEmpty(protocolIds);View on GitHub (pinned to 3a3043227f)
Solutions
- Register a ProviderConfig (explicitly or via dubbo.provider.* properties) reachable from the service's module scope.
- Verify providerIds on the ServiceConfigBase points to an existing ProviderConfig.
- Run the full refresh lifecycle so preProcessRefresh() resolves the provider.
Example fix
// before
serviceConfig.setProvider(null); // or providerIds points to a missing config
// after
ProviderConfig provider = new ProviderConfig();
provider.setId("myProvider");
configManager.addProvider(provider);
serviceConfig.setProvider(provider); Defensive patterns
Strategy: validation
Validate before calling
// Before getMetaData, ensure provider is resolved if refreshed
if (serviceConfig.isRefreshed() && serviceConfig.getProvider() == null) {
ProviderConfig p = moduleConfigManager
.getProvider(serviceConfig.getProviderIds())
.orElseThrow(() -> new IllegalStateException("ProviderConfig missing"));
serviceConfig.setProvider(p);
} Try / catch
try {
Map<String, String> meta = serviceConfig.getMetaData();
} catch (IllegalStateException e) {
if (e.getMessage().contains("Provider is not initialized")) {
// re-resolve provider via providerIds or default and retry refresh
}
throw e;
} Prevention
- Register a ProviderConfig (or dubbo.provider.* defaults) before refreshing services.
- Ensure providerIds reference existing ProviderConfig entries.
- Run the full refresh lifecycle rather than partial refresh.
When it happens
Trigger: Calling getMetaData() on a ServiceConfigBase with isRefreshed() == true but getProvider() == null. The provider is normally resolved by providerIds lookup or default provider during preProcessRefresh().
Common situations: providerIds references a ProviderConfig that does not exist. ProviderConfig removed/renamed after the service was refreshed. Refresh invoked outside the normal lifecycle so preProcessRefresh() did not populate the provider. Scope/model changes orphaning the provider lookup.
Related errors
- Service[<serviceKey>]Target is NULL.
- Service[${serviceKey}]Target is NULL.
- Directory of type {simpleName} already destroyed for service
- Rpc cluster invoker for {getInterface()} on consumer {NetUti
- register bean failed! name=${name}, type=${className}
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/693ccec7556e5276.
Report an issue: GitHub.