{"record":{"id":"793967349152a839","repo":"apache/dubbo","slug":"current-servicemodel-is-not-a-consumermodel","errorCode":null,"errorMessage":"Current ServiceModel is not a ConsumerModel","messagePattern":"Current ServiceModel is not a ConsumerModel","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java","lineNumber":97,"sourceCode":"\n    @Deprecated\n    public void setConfig(AbstractInterfaceConfig config) {\n        this.config = config;\n    }\n\n    /**\n     * ServiceModel should be decoupled from AbstractInterfaceConfig and removed in a future version\n     * @return\n     */\n    @Deprecated\n    public ReferenceConfigBase<?> getReferenceConfig() {\n        if (config == null) {\n            return null;\n        }\n        if (config instanceof ReferenceConfigBase) {\n            return (ReferenceConfigBase<?>) config;\n        } else {\n            throw new IllegalArgumentException(\"Current ServiceModel is not a ConsumerModel\");\n        }\n    }\n\n    /**\n     * ServiceModel should be decoupled from AbstractInterfaceConfig and removed in a future version\n     * @return\n     */\n    @Deprecated\n    public ServiceConfigBase<?> getServiceConfig() {\n        if (config == null) {\n            return null;\n        }\n        if (config instanceof ServiceConfigBase) {\n            return (ServiceConfigBase<?>) config;\n        } else {\n            throw new IllegalArgumentException(\"Current ServiceModel is not a ProviderModel\");\n        }\n    }","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java#L79-L115","documentation":"ServiceModel.getReferenceConfig() is a deprecated accessor that returns the stored config only if it is a ReferenceConfigBase (consumer side). If the ServiceModel was built from a ServiceConfigBase (provider side) or holds some other config type, the cast is impossible and Dubbo throws rather than returning a wrong object. The method is marked @Deprecated because ServiceModel is being decoupled from AbstractInterfaceConfig.","triggerScenarios":"Calling serviceModel.getReferenceConfig() on a ServiceModel whose config is a ServiceConfigBase (i.e. a provider model) or a non-reference config. Common when generic code holds a ServiceModel and assumes it is consumer-side without checking.","commonSituations":"Tooling/introspection that iterates ServiceModels and calls both getReferenceConfig() and getServiceConfig() blindly. Code migrated from older Dubbo where ServiceModel was untyped. Calling getReferenceConfig() on a model obtained from a provider-side registry path.","solutions":["Check the config type before calling: `if (serviceModel.getConfig() instanceof ReferenceConfigBase) { ... }`.","Prefer the non-deprecated APIs that do not assume config subtype; track consumer/provider identity via your own reference rather than via ServiceModel.config.","If you hold a ConsumerModel (a ServiceModel subtype), call getReferenceConfig() only on consumer models — narrow the type first."],"exampleFix":"// before (throws on a provider ServiceModel)\nReferenceConfigBase<?> ref = serviceModel.getReferenceConfig();\n\n// after\nif (serviceModel.getConfig() instanceof ReferenceConfigBase) {\n    ReferenceConfigBase<?> ref = (ReferenceConfigBase<?>) serviceModel.getConfig();\n    // use ref\n} else {\n    // this is a provider or non-reference model; handle accordingly\n}","handlingStrategy":"type-guard","validationCode":"ReferenceConfigBase<?> ref = null;\nAbstractInterfaceConfig cfg = serviceModel.getConfig();\nif (cfg instanceof ReferenceConfigBase) {\n    ref = (ReferenceConfigBase<?>) cfg;\n} // else: not a consumer model — do not call getReferenceConfig()","typeGuard":"static boolean isConsumerModel(ServiceModel sm) {\n    return sm != null && sm.getConfig() instanceof ReferenceConfigBase;\n}","tryCatchPattern":null,"preventionTips":["Check getConfig() instanceof ReferenceConfigBase before calling getReferenceConfig().","Migrate off the deprecated ServiceModel config accessors to role-aware APIs.","Keep consumer and provider ServiceModel references distinct in your code."],"tags":["service-model","consumer-model","deprecated","type-narrowing"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}