{"record":{"id":"523b465e03056357","repo":"apache/dubbo","slug":"current-servicemodel-is-not-a-providermodel","errorCode":null,"errorMessage":"Current ServiceModel is not a ProviderModel","messagePattern":"Current ServiceModel is not a ProviderModel","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java","lineNumber":113,"sourceCode":"            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    }\n\n    public String getServiceKey() {\n        return serviceKey;\n    }\n\n    public void setProxyObject(Object proxyObject) {\n        this.proxyObject = proxyObject;\n    }\n\n    public Object getProxyObject() {\n        return proxyObject;\n    }\n\n    public ServiceDescriptor getServiceModel() {\n        return serviceModel;\n    }","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java#L95-L131","documentation":"ServiceModel.getServiceConfig() is the deprecated counterpart of getReferenceConfig(): it returns the stored config only if it is a ServiceConfigBase (provider side). If the ServiceModel holds a ReferenceConfigBase (consumer side) or another config type, the cast is impossible and Dubbo throws. Deprecated because ServiceModel is being decoupled from AbstractInterfaceConfig.","triggerScenarios":"Calling serviceModel.getServiceConfig() on a consumer-side ServiceModel (config is a ReferenceConfigBase) or a model holding a non-service config. Reached when generic introspection assumes every ServiceModel is a provider.","commonSituations":"Registry/introspection code that calls getServiceConfig() on all ServiceModels regardless of role. Migration from older Dubbo where provider/consumer configs were not distinguished on ServiceModel. Reusing a ServiceModel reference captured on the consumer path.","solutions":["Guard the call: `if (serviceModel.getConfig() instanceof ServiceConfigBase) { ... }`.","Use the non-deprecated, role-aware APIs and keep provider/consumer references separate instead of relying on ServiceModel.config.","Only call getServiceConfig() on a model known to be a ProviderModel."],"exampleFix":"// before (throws on a consumer ServiceModel)\nServiceConfigBase<?> svc = serviceModel.getServiceConfig();\n\n// after\nif (serviceModel.getConfig() instanceof ServiceConfigBase) {\n    ServiceConfigBase<?> svc = (ServiceConfigBase<?>) serviceModel.getConfig();\n    // use svc\n} else {\n    // consumer or non-service model; handle accordingly\n}","handlingStrategy":"type-guard","validationCode":"ServiceConfigBase<?> svc = null;\nAbstractInterfaceConfig cfg = serviceModel.getConfig();\nif (cfg instanceof ServiceConfigBase) {\n    svc = (ServiceConfigBase<?>) cfg;\n} // else: not a provider model — do not call getServiceConfig()","typeGuard":"static boolean isProviderModel(ServiceModel sm) {\n    return sm != null && sm.getConfig() instanceof ServiceConfigBase;\n}","tryCatchPattern":null,"preventionTips":["Check getConfig() instanceof ServiceConfigBase before calling getServiceConfig().","Prefer non-deprecated, role-aware APIs over ServiceModel config accessors.","Only call getServiceConfig() on models known to be providers."],"tags":["service-model","provider-model","deprecated","type-narrowing"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}