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?