【问题标题】:Setting bean property from validator从验证器设置 bean 属性
【发布时间】:2013-02-08 05:44:24
【问题描述】:

有没有办法从 Validator 设置 bean 属性?
就我而言,我有一个validator,它连接到数据库并执行一些验证。
成功验证后,我想将从数据库接收到的对象保存在 bean 属性中。
目前我通过从验证器设置我的 bean 的静态属性来做到这一点。
这是我的验证器方法

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    //perform validation
    if(isValidated) {
        Referral ref = database.getReferral(value.toString());  //receive referral object from batabase
        RegistrationBean.staticReferral = ref; // Set ref to RegistrationBean's static property
    } else {
       FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Invalid Referral!", "Referral does not exist!");
        throw new ValidatorException(msg);
    }
}  

这是我的RegistrationBean

@ManagedBean  
@ViewScoped  
public class RegistrationBean implements Serializable {

    //other bean properties
    private Referral referral;
    public static Referral staticReferral;

    public RegistrationBean() {
        //default constructor
    }

    public Referral getReferral() {
        this.staticReferral = referral;
        return referral;
    }
    // other getters, setters and methods
}

所以我心中的问题是:

  • 有没有办法直接从 bean 设置 bean 属性? (没有 使用静态属性)
  • 使用现有方法是否会出现任何并发问题(一个用户可能会收到其他用户选择的推荐对象等)?

谢谢

【问题讨论】:

  • 托管 bean 中的静态成员在所有实例(以及应用程序的用户)之间共享。因此,在将成员变量设为静态之前,请至少三思。
  • 感谢@MattHandy 的回复。那么如何在不使用静态属性的情况下从验证器中设置 bean 属性呢?
  • 如果您将验证器设为托管 bean,您可以将目标托管 bean 注入您的验证器。有关详细信息,请参阅this answer。 (在示例中注入了 EJB,但您可以通过 @ManagedProperty 注释注入 JSF 托管 bean)。
  • 非常感谢@MattHandy! :) 这确实解决了我的问题! :) 再次感谢!
  • 很高兴听到。所以我会添加一个答案。

标签: jsf-2 validation


【解决方案1】:

托管 bean 中的静态成员在所有实例(以及应用程序的用户)之间共享。因此,在将成员变量设为静态之前,请至少三思。

如果您将验证器设为托管 bean,则可以将目标托管 bean 注入验证器。有关详细信息,请参阅this answer

在给定的示例中,注入了 EJB,但您可以通过 @ManagedProperty 注释注入 JSF 托管 bean

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 2011-06-03
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多