21

私は対処しようとして@javax.faces.bean.ManagedPropertyいますが、成功しません!

私はこのガイドに従ってきましたが、それほど難しくはないようです。しかし、私のコードは単に機能しません!

ここに小さなスニペットがあります

@ManagedBean
@SessionScoped
public class LoginBean {

    private User user;

    // ...
}
@Named
@RequestScoped
public class MessagesBean {

    @ManagedProperty(value = "#{loginBean}")
    private LoginBean loginBean;

    public String getUser() {
        System.err.println(loginBean == null);
        return loginBean.getUser().getUsername();
    }

    // ...
}

このコードは、それが nullNullPointerExceptionであると言って、私に を与えます!loginBean

なにか提案を?

4

1 に答える 1

42

JSF マネージド Bean と CDI Bean を混在させています。LoginBeanは JSF マネージド Bean です (アノテーションがあります)@ManagedBean。MessageBeanは CDI Bean です (注釈があります)@Named。メッセージ Bean を JSF マネージド Bean に変更した場合 (を に置き換え@Named@ManagedBean場合)、問題は解決するはずです (2 つの CDI Bean でも機能するはずです)。または、JSF 2.3 以降を使用している場合は、javax.faces.annotation.ManagedProperty代わりに CDI Bean で使用します。

両方の Bean タイプ間でインジェクションがどのように機能するかの簡単な概要を次に示します。

CDI @Named --> CDI @Named (動作)

CDI @Named --> JSF @ManagedBean (注入された Bean の範囲がより広い場合にのみ機能します)

JSF @ManagedBean --> JSF @ManagedBean (注入された Bean の範囲がより広い場合にのみ機能します)

JSF @ManagedBean --> CDI @Named (動作しません)

ただし、スコープのインポート クラスには注意してください。@SessionScoped@RequestScopedには、Bean の種類に応じてさまざまなクラスがあります。

javax.faces.bean.SessionScoped@ManagedBeans 用

javax.enterprise.context.SessionScopedCDI @Named Bean の場合

また、@Named(CDI)用@Injectと、用用があり@ManagedBeanます@ManagedProperty。CDI で機能しないことが 1 つあります。あなた@ManagedProperty(value = "#{loginBean}")は完全なBean@ManagedProperty(value = "#{loginBean.user}")を取得しますが、Beanの「プロパティ」を取得するには機能します。これは、CDI with で直接行うことはできません@Inject。「解決策」については、@ManagedProperty の CDI 置換を参照してください。

于 2012-03-29T08:10:20.160 に答える