Java Spring ProxyDataSource.getConnection NPE when working with Hikari

Viewed 32

I have convert my application context XML which define the DB connection to beans

But application context fails to start

java.lang.NullPointerException: null
    at net.ttddyy.dsproxy.support.ProxyDataSource.getConnection(ProxyDataSource.java:63)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:371)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:418)

My Config Class

@Configuration
@Order(1)
@Primary
public class OLTPHikariDatasourceConfig {

    private static final String NATIVE = "native";

Creating Bean HikariConfig

    @Bean(name = "hikariConfigDataSource")
    public HikariConfig dataSource(@Value("${jdbc.url}") String jdbcUrl,
            @Value("${jdbc.username}") String userName,
            @Value("${jdbc.password}") String jdbcPassword,
            @Value("${jdbc.connection.type:native}") String jdbcConnectionType,
            @Value("${oltp.auto.commit:true}") boolean autoCommit,
            @Value("${c3p0.connections.min}") int minIdle,
            @Value("${c3p0.connections.max}") int maxIdle
            ){
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("org.postgresql.Driver");
        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setUsername(userName);
        if(NATIVE.equals(jdbcConnectionType)) {
            hikariConfig.setPassword(jdbcPassword);
        } else {

        }
        hikariConfig.setPoolName("OLTP");
        hikariConfig.setMaximumPoolSize(maxIdle);
        hikariConfig.setMinimumIdle(minIdle);
        hikariConfig.setRegisterMbeans(true);
        hikariConfig.setAutoCommit(autoCommit);

        hikariConfig.setDataSourceProperties(getDataSourceProperties());
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);

        return dataSource;
    }

    private Properties getDataSourceProperties(){
        Properties properties = new Properties();
        properties.setProperty("characterEncoding", "UTF-8");
        properties.setProperty("useUnicode", "yes");
        properties.setProperty("rewriteBatchedStatements", "true");
        return properties;
    }

Creating Bean HikariDataSource

    @Primary
    @Bean(name = "dataSourceBase", destroyMethod = "close")
    public HikariDataSource hikarDataSource(HikariConfig hikariConfigDataSource){
        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfigDataSource);
        return hikariDataSource;
    }

Creating Bean DBAccessListener

@Bean(name = "dbAccessListener")
public DBAccessListener DBAccessListener(DatoFeatureFlagService datoFeatureFlagService) {
    DBAccessListener dbAccessListener = new DBAccessListener(datoFeatureFlagService);
    return dbAccessListener;
}

Creating Bean ChainListener

@Bean(name = "queryListener")
public ChainListener queryListener(DBAccessListener dbAccessListener) {
    ChainListener queryListener = new ChainListener();
    queryListener.addListener(dbAccessListener);
    return queryListener;
}

Creating Bean ProxyConfigSpringXmlSupport

@Bean(name = "proxyConfigSupport")
public ProxyConfigSpringXmlSupport proxyDataSourceSupport(ChainListener queryListener) {
    ProxyConfigSpringXmlSupport proxyConfigSpringXmlSupport = new ProxyConfigSpringXmlSupport();
    proxyConfigSpringXmlSupport.setDataSourceName("dataSourceDefaultName");
    proxyConfigSpringXmlSupport.setQueryListener(queryListener);
    return proxyConfigSpringXmlSupport;
}

Creating Bean ProxyConfig

    @Bean(name = "proxyConfig")
    public ProxyConfig proxyConfig(ProxyConfigSpringXmlSupport proxyConfigSpringXmlSupport) {
        return proxyConfigSpringXmlSupport.create();

    }



    @Bean(name = "dataSource")
    public ProxyDataSource proxyDataSource(HikariDataSource hikariDataSource, ProxyConfig proxyConfig){
        ProxyDataSource proxyDataSource = new ProxyDataSource();
        proxyDataSource.setDataSource(hikariDataSource);
        proxyDataSource.setProxyConfig(proxyConfig);
        return proxyDataSource;
    }


    @Bean(name = "jdbcTemplate")
    public JdbcTemplate proxyDataSource(ProxyDataSource proxyDataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(proxyDataSource);
        return jdbcTemplate;
    }

}

In debug connection not appear as NULL

enter image description here

1 Answers

Solved by adding @Primary

@Primary
@Bean(name = "dataSource")
public ProxyDataSource buildDataSource(HikariDataSource hikariDataSource, ProxyConfig proxyConfig){
    ProxyDataSource proxyDataSource = new ProxyDataSource();
    proxyDataSource.setDataSource(hikariDataSource);
    proxyDataSource.setProxyConfig(proxyConfig);
    return proxyDataSource;
}
Related