【问题标题】:How to bind custom jsf-validators to programmatically created HTML Elements?如何将自定义 jsf-validators 绑定到以编程方式创建的 HTML 元素?
【发布时间】:2013-04-03 13:11:49
【问题描述】:

我正在使用 JSF 2.0 并希望将我的自定义 RangeValidator 附加到 HtmlInputText。在我的支持 bean 中,有一个创建 HTMLInputText 的 sn-p。如果我添加一个默认验证器,我的代码会像预期的那样工作。如果我以相同的方式(通过使用 FacesContext ...)添加我的自定义 RangeValidator,则会出现错误,更准确地说是“未知 id”错误。如果我使用 new 关键字创建一个实例,似乎我无法使用我的访问器方法,更准确地说,我的 HtmlInputText 似乎将在运行时使用新创建的 RangeValidator 实例,因此属性值为最小值 = 0并且最大值 = 0,我的验证器没用。如何让我的自定义验证器正常工作?提前致谢。

// Snippet which creates HTML-Components
if ((integerField.getMaximalValue() != null) && (integerField.getMinimalValue() != null)) { // serverside validation required
    // Default JSF Validator - works!
    // final LongRangeValidator validator = (LongRangeValidator) FacesContext.getCurrentInstance().getApplication().createValidator(LongRangeValidator.VALIDATOR_ID);
    // CustomValidator - ERROR: Unknown validator id; 
    final RangeValidator validator = (RangeValidator) FacesContext.getCurrentInstance().getApplication().createValidator("mypackage.validators.RangeValidator");
    // construct custom validator instance - not working, seems to be a different instance!
    // RangeValidator validator = new RangeValidator();
    validator.setMaximum(integerField.getMaximalValue());
    validator.setMinimum(integerField.getMinimalValue());    
    inputInteger.addValidator(validator);
}

// Validator
@FacesValidator("RangeValidator")
public class RangeValidator implements Validator {
    private int minimum;
    private int maximum;
    @Override
    public void validate(FacesContext context, UIComponent uiComponent, Object value) throws ValidatorException {
        //System.out.println("RangeValidator.validate: " + value);
        int val = Integer.parseInt((String) value);
        if ((val <= this.getMaximum()) && (val >= this.getMinimum())){
            // ok
        } else {
            FacesMessage fm = new FacesMessage();
            String message = "Das Feld " + uiComponent.getClientId() + " liefert Validierungsfehler!";
            fm.setSeverity(FacesMessage.SEVERITY_ERROR);
            fm.setSummary(message);
            fm.setDetail(message);
            throw new ValidatorException(fm); 
        }
    }
    // Accessors
    ...
}

【问题讨论】:

    标签: validation jsf


    【解决方案1】:

    我找到了解决这个问题的方法:RangeValidator 也需要实现 Serializable-interface,一切都会按预期工作;

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多