我尝试使用hibernate会话工厂将PartageDomain
保存在我的数据库中,问题是在Session session = sessionFactory.getCurrentSession();
中抛出了nullPointerException
。我的dataSource配置得很好,我已经可以在这个项目中以完全相同的方式保存/保存其他对象,所以我不知道问题来自哪里。
来自控制台例外的快照:
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语言引起的,实际上我在调用getsessionFactory
方法之前通过打印来正确获取对象
在我的PartageDomain类中我有:
@Entity
public class PartageDomain implements Serializable {
// the PartageDomain properties, getters and setters ....
事实上,我告诉你要提到我正在使用注释来管理依赖关系和注入,关于我的会话工厂,我在我的配置文件中将其声明为
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="${hibernate.config}"
p:packagesToScan="com.stage"/>
答案 0 :(得分: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会话。
答案 1 :(得分:1)
我终于找到了问题,事实上,我的partageServiceImpl
具有由spring-hibernate注入系统管理的sessionfactory
属性。
在我的userManagedBean
中,我直接调用PartageDaoImpl.add
方法添加partageDomain
对象,正确的方法是调用PartageServiceImpl.add
,其中包含sessionFactory
1}}属性,在这个中,currentSession
不会为空
我承认这是一个严重的错误,我花了整整一天试图解决它,所以我希望在遇到我的例外情况时,其他人会错误地纠正这个错误。