13

私はセッションスコープのBeanを持っています:

@Named
@SessionScoped
public class SessionBean implements Serializable {

    private String someProperty;

    public String getSomeProperty() {
        return someProperty;
    }

}

これをリクエスト スコープ Bean に注入し、初期化したいと思います。

@Named
@RequestScoped
public class RequestBean {

    @Inject
    private SessionBean sessionBean;  

    public RequestBean() {
        System.out.println(sessionBean.getProperty());
    }

}

ただし、次の例外がスローされます。

java.lang.NullPointerException
    at com.example.RequestBean.<init>(RequestBean.java:42)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.jboss.weld.introspector.jlr.WeldConstructorImpl.newInstance(WeldConstructorImpl.java:206)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:117)
    at org.jboss.weld.bean.ManagedBean.createInstance(ManagedBean.java:336)
    at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.produce(ManagedBean.java:200)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:292)
    ...

これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

27

Bean が構築される前に、注入された依存関係が利用可能であることを期待しています。次のように機能することを期待しています。

RequestBean requestBean;
requestBean.sessionBean = sessionBean; // Injection.
requestBean = new RequestBean(); // Constructor invoked.

しかし、これは事実ではなく、技術的に不可能です。依存関係は構築に注入されます。

RequestBean requestBean;
requestBean = new RequestBean(); // Constructor invoked.
requestBean.sessionBean = sessionBean; // Injection.

@PostConstructBean の構築直後に注入された依存関係に基づいてビジネス ロジックを実行する場合は、代わりにメソッドを使用する必要があります。

コンストラクターを削除し、次のメソッドを追加します。

@PostConstruct
public void init() {
    System.out.println(sessionBean.getSomeProperty());
}
于 2013-05-06T13:45:18.650 に答える