{"record":{"id":"fa4938555c9073cc","repo":"alibaba/druid","slug":"configloader-only-support-druiddatasource","errorCode":null,"errorMessage":"ConfigLoader only support DruidDataSource","messagePattern":"ConfigLoader only support DruidDataSource","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java","lineNumber":109,"sourceCode":" * @author Jonas Yang\n */\npublic class ConfigFilter extends FilterAdapter {\n    private static final Log LOG = LogFactory.getLog(ConfigFilter.class);\n\n    public static final String CONFIG_FILE = \"config.file\";\n    public static final String CONFIG_DECRYPT = \"config.decrypt\";\n    public static final String CONFIG_KEY = \"config.decrypt.key\";\n\n    public static final String SYS_PROP_CONFIG_FILE = \"druid.config.file\";\n    public static final String SYS_PROP_CONFIG_DECRYPT = \"druid.config.decrypt\";\n    public static final String SYS_PROP_CONFIG_KEY = \"druid.config.decrypt.key\";\n\n    public ConfigFilter() {\n    }\n\n    public void init(DataSourceProxy dataSourceProxy) {\n        if (!(dataSourceProxy instanceof DruidDataSource)) {\n            throw new IllegalArgumentException(\"ConfigLoader only support DruidDataSource\");\n        }\n\n        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;\n        Properties connectionProperties = dataSource.getConnectProperties();\n\n        Properties configFileProperties = loadPropertyFromConfigFile(connectionProperties);\n\n        // 判断是否需要解密，如果需要就进行解密行动\n        boolean decrypt = isDecrypt(connectionProperties, configFileProperties);\n\n        if (configFileProperties == null) {\n            if (decrypt) {\n                decrypt(dataSource, null);\n            }\n            return;\n        }\n\n        if (decrypt) {","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/alibaba/druid/blob/fa8dc9912637a2f729eef9f55356621fec18d40e/core/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java#L91-L127","documentation":"ConfigFilter.init(DataSourceProxy) hard-rejects any DataSourceProxy that is not a DruidDataSource. ConfigFilter needs DruidDataSource-specific APIs (connect properties, password fields, setters) to apply decrypted config, so it refuses to operate on other pool wrappers. This is an explicit type guard at the top of init.","triggerScenarios":"ConfigFilter.init() is invoked (typically by the filter chain during datasource init) with a DataSourceProxy implementation that is not DruidDataSource - e.g. a custom DataSourceProxy wrapper, or attaching ConfigFilter to a non-Druid pool via shared configuration.","commonSituations":"A generic Spring/JDBC config block wires ConfigFilter onto a wrong DataSource bean; copy-pasting filter configuration from a Druid pool onto an HikariCP/Tomcat pool; a test harness using a mock DataSourceProxy.","solutions":["Ensure ConfigFilter is only attached to a DruidDataSource bean.","Remove ConfigFilter from the filter list of any non-Druid datasource.","If you need config loading on another pool, implement a separate filter rather than reusing ConfigFilter."],"exampleFix":"// before\n// GenericDataSource ds = new GenericDataSource();\n// ds.getProxyFilters().add(new ConfigFilter());\n\n// after\n// DruidDataSource ds = new DruidDataSource();\n// ds.setFilters(\"config\");","handlingStrategy":"type-guard","validationCode":"if (!(dataSourceProxy instanceof DruidDataSource)) {\n    throw new IllegalStateException(\"ConfigFilter requires a DruidDataSource, got \" + dataSourceProxy.getClass());\n}","typeGuard":"static boolean isDruidDataSource(DataSourceProxy p) {\n    return p instanceof com.alibaba.druid.pool.DruidDataSource;\n}","tryCatchPattern":"try {\n    configFilter.init(dataSourceProxy);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"only support DruidDataSource\")) {\n        // attach ConfigFilter only to DruidDataSource beans; skip for others\n    }\n    throw e;\n}","preventionTips":["Scope ConfigFilter bean wiring to DruidDataSource beans only.","In shared filter config, type-check the target datasource before adding ConfigFilter.","Do not reuse ConfigFilter for non-Druid pools; write a pool-specific equivalent."],"tags":["config-filter","type-check","datasource","configuration"],"backgroundTag":null,"analyzedSha":"fa8dc9912637a2f729eef9f55356621fec18d40e","analyzedAt":"2026-08-14T04:55:06.789Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}