【问题标题】:@ManagedProperty does not reflect changes and keeps returning null@ManagedProperty 不反映更改并不断返回 null
【发布时间】:2012-04-18 22:53:33
【问题描述】:

我正在尝试将一个 sessionscoped bean 的值注入到 viewscoped bean 中,但它一直返回 null,这是一个 sn-p:

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 时为空,我不知道为什么。

【问题讨论】:

  • 你有userName 的二传手吗?你需要一个才能使注入工作。
  • ...您还需要在 @ViewScoped bean 中设置一个设置器。
  • 这会引发异常而不是返回null
  • 抱歉,复活节周末回复晚了 - 是的,很抱歉,我在 getter 代码之后直接有这个:public void setUserName(String userName) {this.userName = userName;}
  • 解决了它 -> 最终移动了我的函数并使用@PostConstruct 来确保在使用变量之前进行注入

标签: jsf null managed-property


【解决方案1】:

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

试试看:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案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");
          }
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          我遇到了这个问题,这个问题实际上是双重的。 (另请注意,@ManagedProperty 只能在 @ManagedBean 类中工作,并且如果 @ManagedProperty 类的范围相同或更小(应用程序、会话、视图、请求等)。)这是我修复它的方法:


          问题 1: JSF 很愚蠢,无法在 abstract 类中正确处理 @ManagedProperty 注入。

          解决方案:

          1. 使每个使用@ManagedProperty 的类都用@ManagedBean 注释。
          2. 使每个使用该属性的abstract 类不使用@ManagedProperty 进行注释,而是仅提供非抽象类将各自覆盖的抽象getter 和setter 方法。
          3. abstract 类中使用abstract 类的getter 方法而不是@ManagedProperty 本身。

          问题 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("")
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-03
            • 2013-11-03
            • 2012-05-11
            • 2021-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多