2014-12-05 154 views
0

我有一個NullPointerException,它正在竊聽我。在我的粗略研究中,我發現這通常發生在人們沒有自動裝配他們的jdbctemplate時,但據我所知,應該正確佈線。作爲領導,我還在學習Spring的基礎知識,我正在使用的代碼是遺留項目的一部分。彈簧空指針異常

ReportDaoImpl

@Service 
    public class ReportDaoImpl implements ReportDao { 
    @Autowired JdbcTemplate jdbcTemplate; 
    private static final Logger log = Logger.getLogger(ReportDaoImpl.class); 

     private static final String SELECT_ALL_ACCOUNT_INFO = "SELECT acct_name, login_name, pswd FROM PG_PAYPAL_ACCOUNTS"; 

     @Autowired 
     public ReportDaoImpl(DataSource dataSource) 
     { 
      log.debug("attempt building"); 
      jdbcTemplate = new JdbcTemplate(dataSource); 
      log.debug("building complete"); 
     } 

     @Override 
     public ArrayList<String[]> getReportAccounts() { 
      log.debug("looking for accounts"); 
      List<Map<String, Object>> resultList; 
      String[] accountDetails; 
      ArrayList<String[]> accounts = new ArrayList<String[]>(); 
      try{ 
       log.debug("Excecuting Query"); 
       resultList = jdbcTemplate.queryForList(SELECT_ALL_ACCOUNT_INFO); 
       log.debug("Query Results"); 
       log.debug(resultList.toString()); 
       if(resultList != null && resultList.size() > 0){ 
        for(Map<String, Object> temprow: resultList){ 
         log.debug("Mapping Query Results to Account POJO"); 
         accountDetails = new String[3]; 
         accountDetails[0] = (String) temprow.get("acct_name"); 
         accountDetails[1] = (String) temprow.get("login_name"); 
         accountDetails[2] = (String) temprow.get("pswd"); 
         log.debug("Single account details"); 
         log.debug(accountDetails.toString()); 
         log.debug("Adding single account to accounts array"); 
         accounts.add(accountDetails); 
        } 
       } 
       return accounts; 
      } catch (Exception e){ 
       log.debug("NO RESULTS: " + e); 
       System.out.println("NO RESULTS: " + e); 
       return null; 
      } 
     } 

} 

XML

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:annotation-config/> 
<context:component-scan base-package="org.test.testpackage.report" annotation-config="false" /> 

<context:property-placeholder location="classpath:project-be.properties" /> 

<import resource="classpath:db-config.xml"/> 

<bean id="pgReportService" name="pgReportService" class="org.test.testpackage.report.service.AccountLookup" scope="singleton" /> 

<bean id="jdbcTemplate" name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

非常感謝!

+0

在至極線你有沒有空指針異常? – 2014-12-05 14:24:59

+0

對不起,它在我的服務中,調用ReportDaoImpl中的getReportAccounts()方法。如果有幫助,我也可以發佈服務。 – iamthereplicant 2014-12-05 14:27:23

+0

請發佈堆棧跟蹤,哪一行是NPE? – kamoor 2014-12-05 14:33:36

回答

0

這個問題很難閱讀。你在執行什麼,實際上是產生一個NullPointerException?

爲了我所理解的你的問題,你可能在Spring中有一個常見的錯誤:如果你的變量jdbcTemplate是在ReportDaoImpl類中自動裝配的,那麼這個類也必須通過自動裝配而不是手動實例化來創建。 DataSource也會發生同樣的事情。

這意味着:

ReportDaoImpl reportDaoImp = new ReportDaoImpl(dataSource); 

不會有instatiated數據源(非實例化的JdbcTemplate),因爲它是你誰是真正的製作實例,而不是讓Spring來做到這一點。

所以,你需要在你的應用程序類指定ReportDaoImpl豆,如:

@Autowired 
    public ReportDaoImpl(DataSource dataSource){ 
     ReportDaoImpl reportDaoImp = new ReportDaoImp(); 
     reportDaoImp.setDataSource(dataSource); 
     return reportDaoImp; 
    } 

而且在您使用ReportDaoImp定義屬性的類:

@Autowired 
ReportDaoImpl reportDaoImp; 

這將實例DataSource(如果還定義了DataSource的bean),然後實例化傳遞此DataSource實例的ReportDaoImpl。

編輯: 其實這個問題的答案可能會回答你:Why is my Spring @Autowired field null?

+0

是的,所以我沒有通過上下文:/ 感謝您的鏈接,我會給你一個答案。 – iamthereplicant 2014-12-05 20:51:45