apache/dubbo · error · IllegalArgumentException

No activate extensions for

Error message

No activate extensions for [${type}] found

What it means

Thrown by ExtensionAccessor.getFirstActivateExtension(type) when an ExtensionLoader exists for the type but getActivateExtensions() returns an empty list — meaning no extensions with matching @Activate conditions are currently active. The loader was found, but no implementation is eligible given the current activation criteria (URL, group, key, values).

Solutions

  1. Check the SPI config files (META-INF/dubbo/<interface>) for the type — ensure at least one implementation is annotated with @Activate.
  2. Verify the @Activate annotation's group/key/value on the implementation matches the runtime context (PROVIDER vs CONSUMER).
  3. If you just need any extension (not an activate-matched one), use getExtension(type, name) or getDefaultExtension(type) instead.
  4. Use getActivateExtensions(type) which returns an empty list rather than throwing, then check isEmpty().

Example fix

// before
Filter f = accessor.getFirstActivateExtension(Filter.class); // empty -> throws

// after
List<Filter> filters = accessor.getActivateExtensions(Filter.class);
if (!filters.isEmpty()) {
    Filter f = filters.get(0);
} else {
    // handle: no matching @Activate filters
}
Defensive patterns

Strategy: fallback

Validate before calling

List<?> exts = accessor.getActivateExtensions(type);
if (exts.isEmpty()) {
    // no matching @Activate extension — use named/default instead
    return accessor.getDefaultExtension(type);
}

Type guard

static boolean hasActivateExtensions(ExtensionAccessor accessor, Class<?> type) {
    return !accessor.getActivateExtensions(type).isEmpty();
}

Try / catch

try {
    return accessor.getFirstActivateExtension(type);
} catch (IllegalArgumentException e) {
    if (e.getMessage().contains("No activate extensions")) {
        return accessor.getDefaultExtension(type);
    } else throw e;
}

Prevention

When it happens

Trigger: Calling getFirstActivateExtension(type) on a valid SPI interface that has no @Activate-annotated extensions, or whose @Activate-annotated extensions do not match the current activation context (wrong @Activate group, key, or value filters).

Common situations: Querying for activated filter or wrapper extensions that exist in the SPI config but whose @Activate(group=...) annotation doesn't match the current provider/consumer context. Also happens when the SPI config files are empty or contain only non-activate extensions. Common after upgrading when an extension's @Activate conditions changed.

Related errors


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

Appendix: source

Thrown at dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionAccessor.java:61

    default <T> T getDefaultExtension(Class<T> type) {
        ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
        return extensionLoader != null ? extensionLoader.getDefaultExtension() : null;
    }

    default <T> List<T> getActivateExtensions(Class<T> type) {
        ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
        return extensionLoader != null ? extensionLoader.getActivateExtensions() : Collections.emptyList();
    }

    default <T> T getFirstActivateExtension(Class<T> type) {
        ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
        if (extensionLoader == null) {
            throw new IllegalArgumentException("ExtensionLoader for [" + type + "] is not found");
        }
        List<T> extensions = extensionLoader.getActivateExtensions();
        if (extensions.isEmpty()) {
            throw new IllegalArgumentException("No activate extensions for [" + type + "] found");
        }
        return extensions.get(0);
    }

    default Set<String> getSupportedExtensions(Class<?> type) {
        ExtensionLoader<?> extensionLoader = getExtensionLoader(type);
        return extensionLoader != null ? extensionLoader.getSupportedExtensions() : Collections.emptySet();
    }
}

View on GitHub (pinned to 3a3043227f)