2

我尝试PartageDomain使用休眠会话工厂将我的数据库保存在我的数据库中,问题是抛出了Session session = sessionFactory.getCurrentSession();一个。nullPointerException我的数据源配置得很好,我已经可以在这个项目中以完全相同的方式保存/保留其他对象,所以我不知道问题出在哪里。

来自控制台异常的快照:

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"/>
4

2 回答 2

1

只是猜测 - 您的上下文文件中可能存在冲突。

我认为您的@Repository注释 bean 以某种方式在 servlet 应用程序上下文中创建,而<tx:annotation-driven transaction-manager="transactionManager" />在根 Web 应用程序上下文中声明。

换句话说,@Transactional作品仅在tx:annotation-driven声明的上下文中。

我想,如果自动扫描在两个上下文配置中都存在,那么某些 bean 可能会被自动扫描并创建两次,从而使它们同时存在于 Web 应用程序和 servlet 应用程序上下文中。

所以解决方案可能是检查所有 bean 是否在正确的位置创建一次 - 根上下文中的 DAO,servlet 上下文中的控制器等。

更新 还请注意,此代码使用 catch em 所有异常处理反模式,并且可能在引发我所知道的 Hibernate 不支持的异常后访问休眠会话。

于 2012-08-03T14:30:50.087 回答
1

终于找到问题了,其实是我partageServiceImpl的这个sessionfactory属性有spring-hibernate注入系统管理。

在我的userManagedBean中,我是直接调用PartageDaoImpl.add添加partageDomain对象的方法,正确的方法是调用PartageServiceImpl.add具有sessionFactory属性的方法,这样currentSession不会为空

我承认这是我犯的一个严重错误,我花了一整天的时间来解决它,所以我希望其他人在看到我遇到的异常时能迅速纠正这个错误。

于 2012-08-03T16:15:07.337 回答