2013-03-07 65 views
0

我有一顆豆:空指針異常,同時使用彈簧 - 雖然豆裝入正確

public class StatusPollingFilter extends AbstractDiscovery implements UserTester 

定義爲:

<bean 
id="statusPollingFilter" 
class="com.xxxxx.yyyyyyy.zzz.StatusPollingFilter"> 
<property 
    name="evoDao" 
    ref="evoDaoFacade"> 
</property> 

它加載好了,爲的日誌顯示:

2013-03-07 11:30:14,703 INFO DefaultListableBeanFactory [RunJSPModule] - Pre-instantiating singletons in org.s[email protected]14966cc: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.config.internalTransactionAdvisor,tilesConfigurer,viewResolver,urlMapping,discovery,statu 
sPollingFilter, 

當我嘗試用它作爲:

TopoObject topoobj = evoDao.getTopoObjectDao().findById(topoId); 

evoDao是主要的傢伙這樣做是在規定的工作: 類AbstractDiscovery 爲:

//Reference to the DAO facade, for accessing the database via hibernate. 
protected EvoTAMDAOFacade evoDao; 

的問題? 因爲我擴展AbstractDiscovery我以爲我會能夠訪問evoDao並使用它作爲正常來得到我的道,但它似乎不是 - 我哪裏錯了? 爲什麼找不到Dao?

的EvoTAMDAOFacade被注入AbstractDiscovery爲:

/** 
* DI method for accessing the DAO facade for accessing the 
* database via hibernate. 
* @param dao 
*/ 
public void setEvoDao(EvoTAMDAOFacade dao) 
{ 
    this.evoDao = dao; 
} 

的getTopoObjectDao()中作爲注射EvoTAMDAOFacade定義:

public TopoObjectDAO getTopoObjectDao() 
{ 
    return this.topoObjectDao; 
} 

AbstractDiscovery定義爲:

public abstract class AbstractDiscovery implements Discovery 

例外情況是:

[07 Mar 2013 11:42:24:353] POLL: Exception while getting obj during status update java.lang.NullPointerException 162.109.37.114 at: 
java.lang.NullPointerException 

另外Q? statusPollFilter在多個對象的調度程序中作爲線程運行 - 我實際上並不確定我應該將它定義爲單例bean,但如果我不這樣做,我如何訪問Dao?

在此先感謝您的幫助。

+0

'TopoObjectDAO'是否也注入'EvoTAMDAOFacade'?這是空的也可能導致你的問題。 – 2013-03-07 14:58:59

+0

它被注入,但這就是我的期望 - 顯然我在這裏做一些男生類型的錯誤,但我不能看到它。我期望注入的TopoObjectDAO可以通過spring初始化,並且最初爲空,但是可以通過.findById(topoId)填充;方法。或者我在這裏找到一些點。我認爲這是一個DAO的事實,並通過它的TopoObject.hbm.xml掛鉤到休眠,這將全部通過休眠處理,我會得到一個填充的對象,或者我需要從ID創建它首先不知何故?謝謝你的幫助。 – user2144209 2013-03-07 17:18:48

+0

您是否嘗試在set方法中設置斷點,確保在應用程序加載時調用它們? – CodeChimp 2013-03-07 21:27:54

回答

0

閱讀更多 - 我遇到過ans。 因爲StatusPollingFilter對象在調度程序的控制下(我知道調度程序與它有關),所以它不知道spring bean,這就是爲什麼當我嘗試注入bean時,我一直得到空值的原因。

我創建了一個類:

ApplicationContextProvider implements ApplicationContextAware 

添加靜態訪問

private static ApplicationContext appContext; 

沒有爲它制定者:

public void setApplicationContext(ApplicationContext context) 
{ 
    appContext = context; 
} 

,並添加

public static Object getBean(String beanName) throws BeansException 
{ 
    return appContext.getBean(beanName); 
} 

在代碼中使用:

EvoTAMDAOFacade evoDao = (EvoTAMDAOFacade) ApplicationContextProvider.getBean("evoDaoFacade"); 

,我現在獲得了外觀bean和所有注入豆成門面。 我仍然有一個問題與休眠會話,但多數民衆贊成由於其他問題。

pt這裏是我沒有訪問的bean,因爲它不在控制彈簧容器,所以我需要以某種方式得到它,可能可以通過工廠方法做到這一點,但爲什麼在有更簡單的時候就搞亂了辦法。 感謝任何可能發佈或試圖理解我的問題的人的幫助。