{"record":{"id":"298939366606917b","repo":"apache/dubbo","slug":"illegal-type-of-parameter-config-config-getcl","errorCode":null,"errorMessage":"Illegal type of parameter 'config' : <config.getClass().getName()>","messagePattern":"Illegal type of parameter 'config' : <config\\.getClass\\(\\)\\.getName\\(\\)>","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java","lineNumber":239,"sourceCode":"        return false;\n    }\n\n    /**\n     * check duplicated ReferenceConfig/ServiceConfig\n     *\n     * @param config\n     */\n    private AbstractInterfaceConfig findDuplicatedInterfaceConfig(AbstractInterfaceConfig config) {\n        String uniqueServiceName;\n        Map<String, AbstractInterfaceConfig> configCache;\n        if (config instanceof ReferenceConfigBase) {\n            return null;\n        } else if (config instanceof ServiceConfigBase) {\n            ServiceConfigBase serviceConfig = (ServiceConfigBase) config;\n            uniqueServiceName = serviceConfig.getUniqueServiceName();\n            configCache = serviceConfigCache;\n        } else {\n            throw new IllegalArgumentException(\n                    \"Illegal type of parameter 'config' : \" + config.getClass().getName());\n        }\n\n        AbstractInterfaceConfig prevConfig = configCache.putIfAbsent(uniqueServiceName, config);\n        if (prevConfig != null) {\n            if (prevConfig == config) {\n                return prevConfig;\n            }\n\n            if (prevConfig.equals(config)) {\n                // Is there any problem with ignoring duplicate and equivalent but different ReferenceConfig instances?\n                if (logger.isWarnEnabled() && duplicatedConfigs.add(config)) {\n                    logger.warn(COMMON_UNEXPECTED_EXCEPTION, \"\", \"\", \"Ignore duplicated and equal config: \" + config);\n                }\n                return prevConfig;\n            }\n\n            String configType = config.getClass().getSimpleName();","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java#L221-L257","documentation":"Thrown by ModuleConfigManager.findDuplicatedInterfaceConfig() when the supplied AbstractInterfaceConfig is neither a ReferenceConfigBase nor a ServiceConfigBase. The duplicate-detection logic only handles service (and returns early for reference) configs; any other AbstractInterfaceConfig subtype is invalid input and rejected with IllegalArgumentException naming the actual class.","triggerScenarios":"Calling the module manager's internal interface-duplicate check with a custom AbstractInterfaceConfig subclass that is not ServiceConfigBase or ReferenceConfigBase. Framework extension code passing an unexpected config subtype.","commonSituations":"Custom config subclasses introduced by integrations that bypass the standard service/reference config hierarchy. Incorrectly routing a non-interface config through the interface dedup path.","solutions":["Only pass ServiceConfigBase or ReferenceConfigBase instances to interface-level config registration.","If you have a custom config type, register it via the generic addConfig path rather than the interface dedup path.","Ensure your config extends the correct base class (ServiceConfigBase/ReferenceConfigBase)."],"exampleFix":"// before\nclass MyConfig extends AbstractInterfaceConfig { }\nmoduleConfigManager.findDuplicatedInterfaceConfig(myConfig); // throws\n// after\nclass MyServiceConfig extends ServiceConfigBase { }","handlingStrategy":"type-guard","validationCode":"AbstractInterfaceConfig cfg = ...;\nif (!(cfg instanceof ServiceConfigBase) && !(cfg instanceof ReferenceConfigBase)) {\n    throw new IllegalArgumentException(\"Config must be ServiceConfigBase or ReferenceConfigBase: \" + cfg.getClass());\n}\nmoduleConfigManager.addConfig(cfg);","typeGuard":"static boolean isInterfaceConfigBase(AbstractConfig c) {\n    return c instanceof ServiceConfigBase || c instanceof ReferenceConfigBase;\n}","tryCatchPattern":"try {\n    moduleConfigManager.addConfig(cfg);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Illegal type of parameter 'config'\")) {\n        // wrap as a ServiceConfigBase/ReferenceConfigBase instead\n    } else throw e;\n}","preventionTips":["Extend ServiceConfigBase or ReferenceConfigBase for custom interface configs.","Use the generic addConfig path for non-interface configs.","Add an instanceof guard before interface-dedup registration."],"tags":["config","interface-config","type-validation","module"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}