@ManagedProperty不能反映更改,并保持返回null(@ManagedProperty

2019-06-23 09:43发布

我想一个sessionscoped豆的价值注入一个viewscoped豆,但它一直返回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;
}

而且它适用于:

@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数据表,当它被称为用户名为空,我不知道为什么。

Answer 1:

最近我有通过注入嵌套管理bean属性问题@ManagedProperties了。 一旦注射它从来没有改变过。 我在吸气评估EL,而不是将其注入做了一个解决方法。

尝试:

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

您也可以尝试注入整个user豆和获得userName在吸气从IT领域。



Answer 2:

随着地方都制定者/吸气,我是有, 因为用户缺少类空构造的同样的问题( 引用到用户)。

在这个例子中,你提供的, dataBrowser和用户豆类构建表之前被实例化,所以引用#{dataBrowser.userName}应该已经找到userName @ManagedProperty正确地注射(并非@PostConstruct问题)。



Answer 3:

我只是碰到了同样的问题来了,发现一个偶然的机会,它不工作,如果我用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”被设定。



Answer 4:

#{user.userName}由JSF解释为getUser().getUserName()

因此,最好是有一个@ManagedProperty类型的User ,其getter / setter方法getUser / setUser 。 这样,您可以通过访问该用户的姓名#{user.userName}



Answer 5:

我有这个问题,而这个问题实际上是双重的。 (另请注意,@ManagedProperty将永远只能在一个@ManagedBean类工作,如果@ManagedProperty类是相同或更小的范围(应用,会话视图,请求等)的。)下面是我如何固定它:


问题1:JSF是愚蠢的,不处理@ManagedProperty在适当的注射abstract类。

解:

  1. 请使用每类@ManagedProperty与被注解@ManagedBean
  2. 使每一个abstract使用该属性不被注解类@ManagedProperty ,而是只提供抽象的getter和setter方法,非抽象类各倍率。
  3. 使用abstract类的getter方法,而不是在@ManagedProperty本身abstract类。

问题2:JSF是愚蠢的,不处理@ManagedProperty在没有JSF创建@ManagedBean类正确注射(即您使用自己创建这些类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("")
}


文章来源: @ManagedProperty does not reflect changes and keeps returning null