apache/dubbo · error · UnsupportedOperationException
Environment is inaccessible for FrameworkModel
Error message
Environment is inaccessible for FrameworkModel
What it means
ScopeModel declares the abstract method modelEnvironment() so that ApplicationModel and ModuleModel can return their Environment (ApplicationEnvironment / ModuleEnvironment). FrameworkModel deliberately overrides it to throw UnsupportedOperationException because environment-scoped resources (config, application name, etc.) only exist below the framework level — a FrameworkModel has no Environment. This is a hard contract: asking a framework-level model for an environment is a category error.
Source
Thrown at dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java:376
}
}
public ApplicationModel getInternalApplicationModel() {
return internalApplicationModel;
}
public FrameworkServiceRepository getServiceRepository() {
return serviceRepository;
}
@Override
protected Lock acquireDestroyLock() {
return destroyLock;
}
@Override
public Environment modelEnvironment() {
throw new UnsupportedOperationException("Environment is inaccessible for FrameworkModel");
}
@Override
protected boolean checkIfClassLoaderCanRemoved(ClassLoader classLoader) {
return super.checkIfClassLoaderCanRemoved(classLoader)
&& applicationModels.stream()
.noneMatch(applicationModel -> applicationModel.containsClassLoader(classLoader));
}
}
View on GitHub (pinned to 3a3043227f)
Solutions
- Resolve the Environment from the ApplicationModel or ModuleModel instead of the FrameworkModel: use scopeModel instanceof checks or ScopeModelUtil.getApplicationModel(scopeModel).modelEnvironment().
- If you only hold a ScopeModel, narrow it first: `if (scopeModel instanceof FrameworkModel) { /* fetch default application */ scopeModel = ((FrameworkModel) scopeModel).defaultApplication(); }` then call modelEnvironment().
- Avoid calling modelEnvironment() on a value returned by getFrameworkModel(...); that method is guaranteed to return a FrameworkModel which cannot supply an environment.
Example fix
// before Environment env = scopeModel.modelEnvironment(); // throws if scopeModel is a FrameworkModel // after Environment env = ScopeModelUtil.getApplicationModel(scopeModel).modelEnvironment();
Defensive patterns
Strategy: type-guard
Validate before calling
ScopeModel scope = /* ... */;
Environment env;
if (scope instanceof ApplicationModel) {
env = ((ApplicationModel) scope).modelEnvironment();
} else if (scope instanceof ModuleModel) {
env = ((ModuleModel) scope).modelEnvironment();
} else if (scope instanceof FrameworkModel) {
env = ((FrameworkModel) scope).defaultApplication().modelEnvironment();
} else {
throw new IllegalStateException("Unsupported scope: " + scope);
} Prevention
- Never call modelEnvironment() on a FrameworkModel; always descend to an ApplicationModel/ModuleModel first.
- Resolve the application model via ScopeModelUtil.getApplicationModel(scope) before asking for its environment.
- Document which ScopeModel subtype your helper requires at its boundary.
When it happens
Trigger: Calling frameworkModel.modelEnvironment() directly. More often reached indirectly by generic code that iterates up the ScopeModel hierarchy calling modelEnvironment() on whichever model it holds, when that model happens to be a FrameworkModel rather than an ApplicationModel/ModuleModel.
Common situations: Custom SPI extensions or framework integrations that hold a ScopeModel reference obtained from getOrDefault() and assume it is always application-scoped. Code migrated from older Dubbo versions where Environment resolution behaved differently. Tests that construct a bare FrameworkModel and call environment-lookup helpers.
Related errors
- Unable to get ModuleModel from ${scopeModel}
- Unable to get ApplicationModel from ${scopeModel}
- Unable to get FrameworkModel from ${scopeModel}
- ExtensionLoader for [${type}] is not found
- setScopeModel is forbidden for ServiceAddressURL
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/dbd6416628f2c915.
Report an issue: GitHub.