2

PartageDomain休止状態のセッション ファクトリを使用してデータベースに保存しようとしましたが、問題はSession session = sessionFactory.getCurrentSession();anullPointerExceptionがスローされることです。私の 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"/>
4

2 に答える 2

1

推測ですが、コンテキスト ファイルで競合が発生している可能性があります。

@Repository注釈付きの Bean は<tx:annotation-driven transaction-manager="transactionManager" />、ルート Web アプリのコンテキストで宣言されている間、何らかの方法でサーブレット アプリケーションのコンテキストで作成されていると思います。

つまり、が宣言さ@Transactionalれているコンテキストでのみ動作します。tx:annotation-driven

自動スキャンが両方のコンテキスト構成に存在する場合、一部の Bean が自動スキャンされて 2 回作成され、それらが Web アプリケーションとサーブレット アプリケーションの両方のコンテキストに存在する可能性があると思います。

したがって、解決策は、すべての Bean が適切な場所 (ルート コンテキストの DAO、サーブレット コンテキストのコントローラーなど) に一度作成されていることを確認することです。

更新 また、このコードはすべての例外処理アンチパターンをキャッチし、Hibernate でサポートされていない例外を発生させた後に Hibernate セッションにアクセスする可能性があることに注意してください。

于 2012-08-03T14:30:50.087 に答える
1

私は最終的に問題を発見しました。実際、Spring-Hibernate インジェクション システムによって管理されるプロパティpartageServiceImplを持っているのは私です。sessionfactory

私のでは、オブジェクトを追加するメソッドをuserManagedBean直接呼び出していました。正しいのは、プロパティを持つを呼び出すことです。この場合、は null にはなりません。PartageDaoImpl.addpartageDomainPartageServiceImpl.addsessionFactorycurrentSession

私が犯したのは重大な誤りであり、それを解決しようとすると丸一日かかることを認めます。そのため、私が持っている例外を見て、この誤りが他の人によって修正されることを願っています.

于 2012-08-03T16:15:07.337 に答える