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

  1. Ensure ConfigFilter is only attached to a DruidDataSource bean.
  2. Remove ConfigFilter from the filter list of any non-Druid datasource.
  3. 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

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


AI-assisted analysis of alibaba/druid@fa8dc99126 (2026-08-14). Data as JSON: /api/errors/fa4938555c9073cc. Report an issue: GitHub.