Этот вопрос задан несколько раз, но все они используют аннотацию @Configuration. Ибо то, что я делаю, это не обязательно. Я использую шаблон singleton для создания подключения к моей базе данных. Однако я получаю следующее сообщение об ошибке:Окружающая среда имеет значение null при введении
[ERROR] com.htd.aop.logging.LoggingAspect - Exception in com.htd.web.rest.PoResource.generateJobTicket() with cause = null
java.lang.NullPointerException: null
at com.htd.config.DataSourceDAO.<init>(DataSourceDAO.java:24) ~[classes/:na]
at com.htd.config.DataSourceDAO.getInstance(DataSourceDAO.java:35) ~[classes/:na]
at com.htd.repository.PoDataSource.<init>(PoDataSource.java:12) ~[classes/:na]
at com.htd.web.rest.util.createJobTicket.<init>(createJobTicket.java:16) ~[classes/:na]
at com.htd.web.rest.PoResource.generateJobTicket(PoResource.java:339) ~[classes/:na]
at com.htd.web.rest.PoResource$$FastClassBySpringCGLIB$$cfcd338a.invoke(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) ~[spring-aop-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at com.htd.aop.logging.LoggingAspect.logAround(LoggingAspect.java:49) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_31]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_31]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_31]
at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_31]
ошибка говорит мне смотреть на линию 24 в моем классе DataSourceDAO, потому что он является недействительным. Он имеет в виду следующее:
// Step 1: JDBC props
String DB_URL = env.getProperty("spring.datasource.url");
String USER = env.getProperty("spring.datasource.username");
String PASS = env.getProperty("spring.datasource.password");
Полный код:
public class DataSourceDAO {
@Inject
private Environment env;
private static DataSourceDAO instance;
java.sql.Connection conn = null;
java.sql.Statement stmt = null;
// Step 1: JDBC props
String DB_URL = env.getProperty("spring.datasource.url");
String USER = env.getProperty("spring.datasource.username");
String PASS = env.getProperty("spring.datasource.password");
private DataSourceDAO() { }
public static DataSourceDAO getInstance() {
if (instance == null) {
synchronized (DataSourceDAO.class) {
if (instance == null) {
instance = new DataSourceDAO();
}
}
}
return instance;
}
public java.sql.Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName("com.mysql.jdbc.Driver");
if (conn == null) {
conn = DriverManager.getConnection(DB_URL, USER, PASS);
}
return conn;
}
}
Я не знаю, почему это было бы пустым. @Inject должен работать нормально, или так я думал.
Почему вы думаете, поле 'env' должно иметь ненулевое значение в то время конструктора вызываются? –
Это трюк. Это не должно. Но даже если это так, почему вы думаете, что что-то должно вводить объект, который вы вручную создаете? –