2012-08-03 202 views
2

我嘗試在我的數據庫中使用hibernate會話工廠保存我的PartageDomain,問題是在Session session = sessionFactory.getCurrentSession();中出現nullPointerException。我的dataSource配置得很好,我已經可以在這個項目中以完全相同的方式保存/保存其他對象,所以我不知道問題來自哪裏。Hibernate - Spring,SessionFactory nullPointerException(調用getCurrentSession()時)

從控制檯異常的快照:

javax.faces.FacesException: /pages/indexx.xhtml @28,72 listener="#{userMB.saveUserRights}": java.lang.NullPointerException 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:85) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 

..... 

javax.el.ELException: /pages/indexx.xhtml @28,72 listener="#{userMB.saveUserRights}": java.lang.NullPointerException 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:108) 
    at com.sun.faces.facelets.tag.jsf.core.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxHandler.java:447) 
    at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:109) 
    at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:98) 
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:764) 
    at javax.faces.component.UIData.broadcast(UIData.java:911) 

... 

Caused by: java.lang.NullPointerException 
    at com.stage.dao.PartageDaoImpl.add(PartageDaoImpl.java:35) 
    at com.stage.beans.UserManagedBean.saveUserRights(UserManagedBean.java:224) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
    ... 23 more 

這裏是從partageDomainImpl類代碼部分:

@Repository 
public class PartageDaoImpl implements PartageDao, Serializable { 
@Resource(name = "sessionFactory") 
    private SessionFactory sessionFactory; 
// sessionFactory getter and setter :) 

public void add(PartageDomain partageDomain) {  System.out.println(partageDomain.getPartageId().getUserDomain().getFirstName()); // I get this 
     Session session = sessionFactory.getCurrentSession(); 
     // Save 
     try { 
      session.persist(partageDomain); 
     } catch (Exception e) { 
      session.saveOrUpdate(partageDomain); 
     } 
    } 

注意,異常不是由EL langage造成的,其實我在調用getsessionFactory方法之前正確地打印對象,從中發現異常

在我的PartageDomain類中我有:

@Entity 
public class PartageDomain implements Serializable { 
// the PartageDomain properties, getters and setters .... 

其實我表明你提我使用註解來管理依賴性和注射,關於我的會話工廠,我宣佈它在我的配置文件作爲

+0

您是否在XML中設置了和/或? – Luciano 2012-08-03 13:01:55

+0

它們都設置正確,我已經使用它們來保存我有的其他對象: \t maouven 2012-08-03 13:24:06

+0

如何將PartageDaoImpl注入UserManagedBean? UserManagedBean的 – Luciano 2012-08-03 14:08:40

回答

1

只是一個猜測 - 您的上下文文件可能有衝突。

我認爲你的@Repository帶註釋的bean在某種程度上是在servlet應用程序上下文中創建的,而<tx:annotation-driven transaction-manager="transactionManager" />是在根web應用程序上下文中聲明的。

換句話說@Transactional只適用於聲明tx:annotation-driven的上下文。

我想如果在兩種上下文配置中都存在自動掃描功能,那麼可以對一些bean進行自動掃描並創建兩次,以使它們既存在於Web應用程序中,也存在於servlet應用程序上下文中。

因此,解決辦法可能是檢查所有的bean被一次,在正確的地方創造的 - 在根上下文的DAO,控制器在servlet上下文等

更新 也請注意,此代碼使用catch em所有的異常處理反模式,並可能訪問Hibernate會話後,它提出了一個Hibernate不支持的異常,據我所知。

+0

我感謝您的幫助,但實際上,我確信bean只創建一次,> >另外,我使用的是FactoryBeans Design模式,當我刪除@Repository時,一個異常說我沒有這個bean,另一方面,如果我們有兩個相同bean的實例,異常表示我們有兩個實例os,通常顯示在控制檯行中。請注意,我使用我的userManagedBean作爲ViewScoped,其中我將userService聲明爲ManagedProperty;是否會導致問題? personnally我不這麼認爲,因爲異常是相對的sessionFactory – maouven 2012-08-03 15:06:08

+0

關於你的迴應,我想知道更多關於創建bean的地方,以及關於應用程序上下文中創建的bean的不同行爲,根環境...,所以如果你有一些很好的鏈接,我會優雅的, – maouven 2012-08-03 15:12:09

+0

你可以在*不同的上下文中擁有相同的bean,並且刪除@Repository將使它們從兩者中消失。 – 2012-08-03 15:18:57

1

我終於找到了問題,實際上,這是我的partageServiceImpl,它具有由spring-hibernate注入系統管理的sessionfactory屬性。

在我userManagedBean,我是直接調用的PartageDaoImpl.add方法來添加partageDomain對象時,正確的做法是調用它具有sessionFactory屬性PartageServiceImpl.add,在這個whay的currentSession不會是空

我承認這是我犯的一個嚴重錯誤,它花費了整整一天的時間來解決它,所以我希望這個錯誤在別人看到我有的例外時會被其他人糾正。

相關問題