0

My programme was trying to do a Spring configuration for my Oracle database. I would want to get the value from application.properties, rather than hardcoding the username and password in my DBCPDataSource java class. However, i keep facing this problem whereby spring is not able to inject the properties values to my java class. It keeps showing java.lang.NullPointerException error.

My codes are here below:

DBCPDataSource.java

package com.pms.pmsapp.util;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;

public class DBCPDataSource {

    @Value("${spring.datasource.url}")
    private String url;

    private static String URL_STATIC;

    @Value("${spring.datasource.url}")
    public void setUrl(String url){
        DBCPDataSource.URL_STATIC = url;
    }
    
    @Value("${spring.datasource.username}")
    private String username;

    private static String USERNAME_STATIC;

    @Value("${spring.datasource.username}")
    public void setUsername(String username){
        DBCPDataSource.USERNAME_STATIC = username;
    }
    
    @Value("${spring.datasource.password}")
    private String password;

    private static String PASSWORD_STATIC;

    @Value("${spring.datasource.password}")
    public void setPassword(String password){
        DBCPDataSource.PASSWORD_STATIC = password;
    }

    private static BasicDataSource ds = new BasicDataSource();

    static {
        ds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        ds.setUsername("PMS_APP");
        ds.setPassword("password");
        ds.setMinIdle(5);
        ds.setMaxIdle(10);
        ds.setMaxOpenPreparedStatements(100);
    }
    
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    
    private DBCPDataSource(){ }
}

application.properties

spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=pms_app
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

So whenever the programme calls dBCPDataSource.getConnection(), NullPointerException will be shown:

org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) ~[commons-dbcp-1.4.jar:1.4]
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) ~[commons-dbcp-1.4.jar:1.4]
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ~[commons-dbcp-1.4.jar:1.4]
    at com.pms.pmsapp.util.DBCPDataSource.getConnection(DBCPDataSource.java:91) ~[classes/:na]

When i hardcode the details in the static class, the programme will work normally. The below codes worked perfectly.

        ds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        ds.setUsername("PMS_APP");
        ds.setPassword("password");
        ds.setMinIdle(5);
        ds.setMaxIdle(10);
        ds.setMaxOpenPreparedStatements(100);
    }

I referred to this article closely, but unable to get it working. https://www.baeldung.com/spring-inject-static-field

I have tried the @ConfigurationProperties method to inject the properties values to my java class too, but failed.It gave me the same problem. https://www.baeldung.com/configuration-properties-in-spring-boot

Can anyone spot any errors?

calai
  • 3
  • 5

0 Answers0