Обновить атрибуты валидатора JSF при повторном рендеринге - PullRequest
0 голосов
/ 14 декабря 2010

У меня проблема со значениями атрибутов компонента валидатора. Очевидно, валидатор создается при первом посещении страницы.

Пожалуйста, смотрите мой код ниже:

<h:inputText value="#{qsetting.value}" rendered="#{qsetting.dataType=='Double'}">  
   <mw:validateRange min="#{qsetting.minValue}" max="#{qsetting.maxValue}" />  
</h:inputText>

Компонент inputText перерисовывается через ajax, но, по-видимому, включая отображаемое значение. К сожалению, qsetting.minValue и qsetting.maxValue не обновляются, из-за чего мой валидатор работает неправильно.

Есть ли возможность обновить валидатор, чтобы убедиться, что он повторно извлекает свои атрибуты или просто создать новый экземпляр валидатора? Сам класс валидатора в настоящее время реализует «Validator, Serializable». Также я использую jsf1.2 с facelets ...

Спасибо, Стивен

1 Ответ

0 голосов
/ 15 мая 2012

За последние годы я несколько раз сталкивался с этой проблемой в среде без поддержки Ajax, и сегодня снова столкнулся с ней.Добавление Ajax на самом деле ничего не меняет, так как атрибут validator никогда не оценивается снова после первоначальной сборки страницы, ajax или иным образом.

Единственное решение, которое я придумал, это установить атрибут validatorк выражению валидатора, затем оцените это выражение внутри метода validate.

Еще одна проблема, с которой я столкнулся (также с JSF 1.2 и Facelets), заключается в том, что не все переменные EL работали.Мне пришлось использовать статический управляемый бин в качестве корня моего выражения для доступа к значению.Значение Facet ui: param в качестве корня не будет работать.Я не проверял, чтобы увидеть, что еще может не правильно оценить.Это может быть связано с другой ошибкой в ​​дизайне самого JSF.См. http://myfaces.apache.org/core12/myfaces-api/apidocs/javax/faces/context/FacesContext.html#getELContext%28%29.

Например, вместо:

max="#{qsetting.maxValue}"

используйте

maxExpression="qsetting.maxValue"

Затем

public String getMax(FacesContext context) {
    Application app = context.getApplication();
    ExpressionFactory exprFactory = app.getExpressionFactory();
    ValueExpression ve = exprFactory.createValueExpression(context.getELContext(),
            "#{" + getMaxExpression() + "}",
            String.class);

    Object result = ve.getValue(context.getELContext());

    return (String)result;
}

public String getMaxExpression() {
    return this.maxExpression;
}

public void setMaxExpression(String maxExpression) {
    this.maxExpression = maxExpression;
}


//// StateHolder

public boolean isTransient() {
    return isTransient;
}

public void setTransient(boolean newTransientValue) {
    isTransient = newTransientValue;
}

public Object saveState(FacesContext context) {
    Object[] state = new Object[1];
    state[0] = maxExpression;
    return state;
}

public void restoreState(FacesContext context, Object state) {
    Object[] values = (Object[]) state;
    maxExpression = (String) values[0];
}

ОБНОВЛЕНИЕ 2012-09-19:

После изучения того, как MyFaces Commons решает эту проблему, лучшим решением будет изменение правил, используемых Facelets для оценки выражений атрибутов валидатора и конвертера.

В основном все сводится к добавлению нового валидатораили конвертер MetaRule, который при применении проверяет, является ли значение атрибута не-литеральным.Если он не литеральный, вызовите специальный метод на вашем валидаторе или конвертере, который передает выражение значения, а не текущее значение.

http://svn.apache.org/viewvc/myfaces/commons/trunk/myfaces-commons-validators/src/main/java/org/apache/myfaces/commons/validator/_ValidatorRule.java?view=markup

В этот момент валидатор долженсохранить выражение значения как состояние и оценить его при необходимости.MyFaces commons предоставляет всю сложную инфраструктуру, чтобы сделать это в общем, но вы можете сбросить все это и написать простое настраиваемое правило и напрямую управлять ValueExpression самостоятельно, подобно тому, что я публиковал изначально.

...