2012-04-05 1 views
3

を返す保持しません:@ManagedPropertyは、変更を反映して、私はviewscoped Beanに1つのsessionscoped豆の値を挿入しようとしているが、それはnullを返し続け、ここでは、スニペットのnull

import javax.faces.application.FacesMessage; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.context.FacesContext; 

//Class for managing the current logged-in user 
@ManagedBean(name="user") 
@SessionScoped 
public class User implements Serializable{ 

private String userName; 

public void setUserName(String userName) { 
    this.userName = userName; 
} 
public String getUserName() { 
    return this.userName; 
} 

そして、それはで使用しています:ユーザ名がnullであると私はなぜわからないと呼ばれていたときに

@ManagedBean(name="databrowser") 
@ViewScoped 
public class dataBrowser implements Serializable { 

private List<UploadData> dataItems; 
private SelectItem[] dataTypeOptions, qualityOptions, accessOptions; 
private UploadData selectedData; 
private String filelocation; 

@ManagedProperty(value="#{user.userName}") 
private String userName; 

public String getUserName() { 
    return this.userName; 
} 

dataBrowserは、Primefacesのデータテーブルを移入するために使用されます。

+1

あなたは 'userName'用セッターを持っていますか:

  • は、次のコードを使用しますか?注射作業をするためにはあなたが必要です。 –

  • +1

    ... @ViewScoped Beanにもセッターが必要です。 –

    +1

    それは 'null'を返すのではなく例外をスローしたでしょう。 – BalusC

    答えて

    2

    最近ネストされたマネージドBeanのプロパティを@ManagedPropertiesで注入することに問題があります。一度注入するとそれは決して変化しなかった。私はゲッターのELを注入するのではなく評価することで回避策をとった。

    はそれを試してみてください。

    public String getUserName() { 
        FacesContext context = FacesContext.getCurrentInstance(); 
        return (String) context.getApplication().evaluateExpressionGet(context,"#{user.userName}", String.class); 
    } 
    

    また、全体user Beanを注入しようとするゲッターでそれからuserNameフィールドを取得することができます。すべての設定主体と

    0

    /代わりにゲッター、私は同じ問題(ユーザへのヌル参照)のため、Userクラスで空のコンストラクタが欠落を抱えていました。あなたが提供した例で

    dataBrowserおよびユーザー豆がそう #{dataBrowser.userName}が既に見つける必要があります参照、テーブルを構築する前にインスタンス化されている userName @ManagedProperty正しく( @PostConstruct問題点ではない)を注入。

    0

    私はfirefox(実際にはLinuxの下でicedove)を試してもうまくいきましたが、偶然見つけましたが、Eclipseの組み込みブラウザ。

    これは私にとっては意味がありませんが、既に別のブラウザで試してみましたか?


    michal777の回答がうまく機能しています。

    @ManagedProperty("#{nameBean}") 
    private NameBean nameBean; 
    public NameBean getNameBean() { return nameBean; } 
    public void setNameBean(NameBean nameBean) { this.nameBean = nameBean; } 
    
    public NameBean getNameBean_Workaround() { 
        FacesContext context = FacesContext.getCurrentInstance(); 
        return (NameBean) context.getApplication().evaluateExpressionGet(context,"#{nameBean}", NameBean.class); 
    } 
    

    を、後に:私はこれまで、それを拡張してきた

    if (nameBean != null) { 
         nameBean.setName("achsooo"); 
        } 
        else { 
         getNameBean_Workaround().setName("achsooo2222"); 
        } 
    

    さて、日食ブラウザ "achsooo" に設定されます、とicedove "achsooo2222" に設定されます。

    0

    #{user.userName}はだから、そのゲッター/セッターメソッドgetUser/setUserと、タイプUser@ManagedPropertyを持っている方がよいgetUser().getUserName()

    としてJSFによって解釈されます。これで、#{user.userName}によってユーザーの名前にアクセスできます。

    0

    私はこの問題を抱えていましたが、問題は実際には二重でした。 (@ManagedPropertyは@ManagedBeanクラスでのみ動作し、@ManagedPropertyクラスのスコープが同じか小さい(アプリケーション、セッション、ビュー、リクエストなど)であることにも注意してください。)ここで私はそれを固定する方法である:


    問題1: JSFは愚かであるとabstractクラスで適切に@ManagedProperty注入を処理しません。

    ソリューション:

    1. @ManagedProperty@ManagedBeanでアノテートさを使用するすべてのクラスを作成します。
    2. @ManagedPropertyと注釈を付けないプロパティを使用するすべてのabstractクラスを作成し、代わりに非抽象クラスがオーバーライドする抽象ゲッターとセッターメソッドのみを用意します。
    3. abstractクラスの@ManagedPropertyクラスではなく、abstractクラスのgetterメソッドを使用します。

    問題2: JSFは愚かであるとJSFで作成されていない@ManagedBeanクラスで適切に@ManagedProperty注入を処理しない(すなわち、あなた自身がnewを使用して、これらのクラスを作成しています)。

    ソリューションオプション:

    • JSFは@ManagedPropertyを使用するクラスを作成してみましょう。

    MyClass example = Utils.getELValue("EL Expression Goes Here", MyClass.class); 
    
    public static <T> T getELValue(final String elName, final Class<T> clazz) { 
        FacesContext fc = FacesContext.getCurrentInstance(); 
        return (T) fc.getApplication().getELResolver().getValue(fc.getELContext(), null, elName); 
    
        // Potential (untested) alternative: 
        // ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().getAttribute("") 
    } 
    
    関連する問題