0

セッション スコープの Bean をビュー スコープの Bean に注入しようとするたびに、その Bean を呼び出すときに NullPointerException が発生します。この問題は、セッション Bean の自動インスタンス化に直接関連していますか?

これが私がこれまでに試したことです:

顔-config.xml

<managed-bean>
    <managed-bean-name>sessionBean</managed-bean-name>
    <managed-bean-class>com.example.SessionBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>viewBean</managed-bean-name>
    <managed-bean-class>com.example.ViewBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
    <managed-property>
        <property-name>sessionBean</property-name>
        <property-class>com.example.SessionBean</property-class>
        <value>#{sessionMBean}</value>
    </managed-property>
</managed-bean>

SessionBean.java:

package com.example;

public class SessionBean {

    public SessionBean() {
        System.out.println("Session is instantiated.");
    }

    public void sayHello() {
        System.out.println("Hello from session");
    }
}

ViewBean.java:

package com.example;

public class ViewBean {

    private SessionBean sessionBean;

    private String text = "Look at me!";

    public ViewBean() {
        System.out.println("View bean is instantiated.");

        sessionBean.sayHello();
    }

    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public String getText() {
        return text;
    }
}

および index.xhtml の関連コンテンツ:

<f:view>
    <h:outputText value="#{viewBean.text}"/>
</f:view>

そして、これは私が得るものです:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.example.ViewBean.
...
Caused by: java.lang.NullPointerException
    at com.example.ViewBean.(ViewBean.java:12)

これは、出荷された jsf-2-0.war がライブラリとしてデプロイされた weblogic-10.3.6 で実行されます (または実行されません)。

ここで何が間違っていますか?これがコンテナのバグではないことを願っています...

4

1 に答える 1

1

コンストラクターで@SessionScopedBeanにアクセスすることはできません。@ViewScopedBeanは、 Bean@SessionScopedのコンストラクター@ViewScopedが呼び出された後に設定されます。Beanにアクセスするには@PostConstruct、ある種のinitメソッドでアノテーションを使用します。@SessionScoped

public ViewBean() {
  System.out.println("Constructor viewbean");
}

@PostConstruct
public void init() {
  sessionBean.sayHello();
}

その他のリンク:
なぜ@PostConstructを使用するのですか?
SpringInjection-コンストラクター内で注入されたオブジェクトへのアクセス

于 2013-03-20T15:09:45.140 に答える