3

我正在尝试将一个 sessionscoped bean 的值注入到 viewscoped bean 中,但它一直返回 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 数据表,当它被称为 userName 时为空,我不知道为什么。

4

5 回答 5

2

最近我也遇到了注入嵌套托管 bean 属性的问题@ManagedProperties。一旦注入它就永远不会改变。我通过在 getter 中评估 EL 而不是注入它来解决问题。

试试看:

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

您还可以尝试注入整个userbean 并userName在 getter 中从中获取字段。

于 2012-08-03T09:03:44.593 回答
0

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

所以最好有一个@ManagedPropertyof type User,它的 getter/setter 方法getUser/ setUser。有了它,您可以通过 访问用户名#{user.userName}

于 2014-08-27T10:41:11.240 回答
0

在所有 setter/getter 就位后,由于在 User 类中缺少空构造函数,我遇到了同样的问题(对用户的null引用)。

在您提供的示例中,dataBrowser在构造表之前实例化了和用户 bean,因此引用#{dataBrowser.userName}应该已经找到userName @ManagedProperty正确注入的(不是@PostConstruct问题)。

于 2013-05-09T09:46:11.113 回答
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");
    }

现在,在 eclipse 浏览器中设置了“achsooo”,在 icedove 中设置了“achsooo2222”。

于 2014-05-16T21:18:57.660 回答
0

我有这个问题,问题实际上是双重的。(另请注意,@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("")
}
于 2017-10-17T14:32:25.063 回答