{"record":{"id":"a80cd4333170f99a","repo":"apache/dubbo","slug":"invalid-scope-model-expect-to-be-a-modulemodel-bu","errorCode":null,"errorMessage":"Invalid scope model, expect to be a ModuleModel but got: <scopeModel>","messagePattern":"Invalid scope model, expect to be a ModuleModel but got: <scopeModel>","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dubbo-common/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java","lineNumber":121,"sourceCode":"        super(moduleModel);\n    }\n\n    @Override\n    @Transient\n    public ModuleModel getScopeModel() {\n        return (ModuleModel) super.getScopeModel();\n    }\n\n    @Override\n    @Transient\n    protected ScopeModel getDefaultModel() {\n        return ApplicationModel.defaultModel().getDefaultModule();\n    }\n\n    @Override\n    protected void checkScopeModel(ScopeModel scopeModel) {\n        if (!(scopeModel instanceof ModuleModel)) {\n            throw new IllegalArgumentException(\n                    \"Invalid scope model, expect to be a ModuleModel but got: \" + scopeModel);\n        }\n    }\n\n    @Transient\n    protected ModuleConfigManager getModuleConfigManager() {\n        return getScopeModel().getConfigManager();\n    }\n\n    public Integer getForks() {\n        return forks;\n    }\n\n    public void setForks(Integer forks) {\n        this.forks = forks;\n    }\n\n    public Integer getTimeout() {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java#L103-L139","documentation":"Thrown by AbstractMethodConfig.checkScopeModel() when the ScopeModel attached to a method-level config is not a ModuleModel. Dubbo 3.x uses a hierarchical scope model (ApplicationModel > ModuleModel); method configs are inherently module-scoped, so attaching an ApplicationModel or other ScopeModel subtype is invalid. This guard enforces the correct level of the config object tree.","triggerScenarios":"Programmatically calling config.setScopeModel() with an ApplicationModel instance instead of a ModuleModel on a MethodConfig (or subclass). Building configs manually outside the normal bootstrap path and injecting the wrong scope model level.","commonSituations":"Migrating from Dubbo 2.x where scope models did not exist and incorrectly passing the application-level model. Mixing FrameworkModel/ApplicationModel/ModuleModel when constructing configs in custom bootstrap code.","solutions":["Pass a ModuleModel to setScopeModel(), obtained via applicationModel.getDefaultModule() or a specific module.","Avoid setting the scope model manually; let Dubbo assign the default model (getDefaultModel() returns the default module).","Ensure configs created within the same module share that module's ModuleModel."],"exampleFix":"// before\nmethodConfig.setScopeModel(applicationModel); // wrong level\n// after\nmethodConfig.setScopeModel(applicationModel.getDefaultModule());","handlingStrategy":"type-guard","validationCode":"ModuleModel module = applicationModel.getDefaultModule();\nif (!(module instanceof ModuleModel)) {\n    throw new IllegalStateException(\"Expected ModuleModel\");\n}\nmethodConfig.setScopeModel(module);","typeGuard":"static boolean isModuleScoped(ScopeModel model) {\n    return model instanceof org.apache.dubbo.rpc.model.ModuleModel;\n}","tryCatchPattern":"try {\n    methodConfig.setScopeModel(model);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"ModuleModel\")) {\n        methodConfig.setScopeModel(applicationModel.getDefaultModule());\n    } else throw e;\n}","preventionTips":["Prefer applicationModel.getDefaultModule() over passing application-level models.","Avoid manually setting scope model unless necessary; rely on defaults.","In custom bootstrap, log the scope model class before assignment."],"tags":["config","scope-model","module-model","dubbo3"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}