Теперь я понимаю, почему я не смог воспроизвести это вчера.В моей игровой среде я случайно установил следующий контекстный параметр, отличный от значения по умолчанию:
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
Эта проблема связана с JSF , проблема 1492 .A <f:validateDoubleRange>
, атрибуты которого по EL связаны со свойством bean-объекта области видимости, будет неявно воссоздавать весь bean-компонент из-за неприятной проблемы с куриным яйцом, потому что валидаторы создаются на основе запроса и эти свойства должны передаваться валидаторуconstruction.
Если вы не хотите отключать частичное сохранение состояния (очень разумное), тогда вам лучше всего создать и удерживать валидатор в управляемом bean-объекте вида:
public Validator getValidator() {
return new DoubleRangeValidator(foo.getMaximum(), foo.getMinimum());
}
(обратите внимание, что делать это в геттере - это плохой дизайн, но, поскольку вы готовите foo
в сеттере вместо метода слушателя preRenderView
, другого пути нет, иначесделать правильно в том же методе слушателя)
с
<h:inputText validator="#{fooController.validator.validate}" ...>
Или, альтернативно, создать собственный валидатор для того, который заменяет <f:validateDoubleRange>
:
<f:validator validatorId="bindableDoubleRangeValidator" />
<f:attribute name="minimum" value="#{fooController.foo.minAmount}" />
<f:attribute name="maximum" value="#{fooController.foo.maxAmount}" />
с
package com.example;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.DoubleRangeValidator;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.ValidatorException;
@FacesValidator("bindableDoubleRangeValidator")
public class BindableDoubleRangeValidator extends DoubleRangeValidator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
setMinimum((Double) component.getAttributes().get("minimum"));
setMaximum((Double) component.getAttributes().get("maximum"));
super.validate(context, component, value);
}
}
Обновление : проблема 1492 с куриным яйцом устранена с Mojarra 2.1.18 (январь 2013 г.).Так что, если вы натолкнетесь на это в эти дни, то вы также можете подумать об обновлении.