2015-06-30 4 views
0

Этот вопрос задан несколько раз, но все они используют аннотацию @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 должен работать нормально, или так я думал.

+0

Почему вы думаете, поле 'env' должно иметь ненулевое значение в то время конструктора вызываются? –

+1

Это трюк. Это не должно. Но даже если это так, почему вы думаете, что что-то должно вводить объект, который вы вручную создаете? –

ответ

1

Прежде всего, вы не получите ничего введенного в классе, который вы запускаете вручную.

После того, как вы исправили ручную инициализацию класса, вы должны заметить, что внутри конструктора вы не будете иметь введенные вами свойства, все они заданы после создания экземпляра.

Если вы хотите сделать некоторое поведение после Instancing объекта вы должны использовать @PostConstruct обратный вызов (http://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/)

+0

@ Luscas Saldanha Я использовал «@Inject», думая, что это решит проблему вручную. Однако даже если я использую «@PostConstruct», я все еще не могу использовать новый оператор в среде «Среда», и я использую шаблон Singleton, поэтому мой конструктор является закрытым. – Drew1208

+0

Вы знаете, одноэлементный шаблон может быть реализован различными способами. Все весенние бобы по умолчанию являются одиночными. Если вы планируете использовать Spring, вы должны позволить контейнеру обрабатывать его жизненный цикл. Почему вы не делаете свой DataSourceDAO весной? Вы можете использовать аннотацию '@ Component' в классе. Затем вы сможете вводить DAO туда, где вы хотите. :) –

Смежные вопросы