alibaba/druid · error · IllegalArgumentException
ConfigLoader only support DruidDataSource
Error message
ConfigLoader only support DruidDataSource
What it means
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.
Source
Thrown at core/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java:109
* @author Jonas Yang
*/
public class ConfigFilter extends FilterAdapter {
private static final Log LOG = LogFactory.getLog(ConfigFilter.class);
public static final String CONFIG_FILE = "config.file";
public static final String CONFIG_DECRYPT = "config.decrypt";
public static final String CONFIG_KEY = "config.decrypt.key";
public static final String SYS_PROP_CONFIG_FILE = "druid.config.file";
public static final String SYS_PROP_CONFIG_DECRYPT = "druid.config.decrypt";
public static final String SYS_PROP_CONFIG_KEY = "druid.config.decrypt.key";
public ConfigFilter() {
}
public void init(DataSourceProxy dataSourceProxy) {
if (!(dataSourceProxy instanceof DruidDataSource)) {
throw new IllegalArgumentException("ConfigLoader only support DruidDataSource");
}
DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
Properties connectionProperties = dataSource.getConnectProperties();
Properties configFileProperties = loadPropertyFromConfigFile(connectionProperties);
// 判断是否需要解密,如果需要就进行解密行动
boolean decrypt = isDecrypt(connectionProperties, configFileProperties);
if (configFileProperties == null) {
if (decrypt) {
decrypt(dataSource, null);
}
return;
}
if (decrypt) {View on GitHub (pinned to fa8dc99126)
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.
Example fix
// before
// GenericDataSource ds = new GenericDataSource();
// ds.getProxyFilters().add(new ConfigFilter());
// after
// DruidDataSource ds = new DruidDataSource();
// ds.setFilters("config"); Defensive patterns
Strategy: type-guard
Validate before calling
if (!(dataSourceProxy instanceof DruidDataSource)) {
throw new IllegalStateException("ConfigFilter requires a DruidDataSource, got " + dataSourceProxy.getClass());
} Type guard
static boolean isDruidDataSource(DataSourceProxy p) {
return p instanceof com.alibaba.druid.pool.DruidDataSource;
} Try / catch
try {
configFilter.init(dataSourceProxy);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("only support DruidDataSource")) {
// attach ConfigFilter only to DruidDataSource beans; skip for others
}
throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Config DataSource error.
- Cannot load remote config file from the [config.file={config
- Failed to decrypt.
- {className}
- maxEvictableIdleTimeMillis must be grater than minEvictableI
AI-assisted analysis of alibaba/druid@fa8dc99126 (2026-08-14).
Data as JSON: /api/errors/fa4938555c9073cc.
Report an issue: GitHub.