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

  1. Register a ProviderConfig (explicitly or via dubbo.provider.* properties) reachable from the service's module scope.
  2. Verify providerIds on the ServiceConfigBase points to an existing ProviderConfig.
  3. 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

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


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