web-dev-qa-db-ja.com

JSFで別のBeanからmanagedbeanプロパティを取得する方法

同様の質問を検索しましたが、少し混乱しています。ログインページがあるので、LoginBeanもそうです。

@ManagedBean(name = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {    
    private String password="";
    private String image="";
    @ManagedProperty(value = "#{loginBeanIdentityNr}")
    private String identityNr="";
...

成功した後、orderlistページに移動するので、OrderBeanもあります。

@ManagedBean(name = "OrderBean")
@SessionScoped
       public class OrderBean {
            List<Ordery> sdList;

            public List<Order> getSdList() {

                try {

                    String identityNr ="";
                    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
                    LoginBean lBean = (LoginBean) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "loginBean");
                    identityNr =lBean.getIdentityNr();
                    sdList = DatabaseUtil.getOrderByIdentityNr(identityNr);
    ...
    }

LoginBean全体は必要なく、ManagedProperty "loginBeanIdentityNr"だけが必要です。しかし、以下のコードは(もちろん)機能しません。

identityNr = (String) FacesContext.getCurrentInstance()
                        .getApplication().getELResolver()
                        .getValue(elContext, null, "loginBeanIdentityNr");

今回はnullを返します。完全なBeanプロパティが必要な場合は、これらのBeanを注入できますよね?それで、このアプローチについて何か提案はありますか?できる<f:attribute> 利用される?

17
asyard

@ManagedProperty JSFがプロパティを「エクスポート」する場所ではなく、JSFがプロパティを設定する場所を宣言します。 LoginBeanOrderBeanのプロパティとして挿入するだけです。

public class OrderBean {

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

    // ...
}

このように、OrderBeanでそれにアクセスすることができます

loginBean.getIdentityNr();

または、OrderBeanリクエストまたはビューのスコープを作成する場合、identityNrプロパティのみを設定することもできます。

public class OrderBean {

    @ManagedProperty(value="#{loginBean.identityNr}")
    private String identityNr; // +setter

    // ...
}

無関係具体的な問題に:空の文字列でStringプロパティを初期化することはお勧めできません。

44
BalusC