<f:validator>
- обработчик тега, а не компонент пользовательского интерфейса. Все его атрибуты относятся к определению, оцениваемому во время создания времени просмотра, а не во время отображения рендеринга. Время сборки представления - это тот момент, когда файл XHTML анализируется в дереве компонентов JSF, как доступно context.getViewRoot()
. Тот же вид обычно повторно используется через обратную передачу в тот же вид, возвращая null
/void
в (ajax) действиях.
Таким образом, вы не можете позволить атрибуту обработчика тега зависеть от атрибута времени рендеринга, который может измениться во время запроса обратной передачи. Один из способов - выполнить эту проверку внутри самого пользовательского валидатора.
E.g.
<h:inputText>
<f:validator validatorId="myValidator" />
<f:attribute name="radio" value="#{myBean.checkedSelectOneRadioValue}" />
</h:inputText>
с
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (!"TEST".equals(component.getAttributes().get("radio"))) {
return;
}
// Perform actual validation here.
}
Вы можете также использовать в качестве альтернативы OmniFaces<o:validator>
вместо этого. Он расширяет стандарт <f:validator>
с оценкой EL по атрибутам на основе запроса.
<h:inputText>
<o:validator validatorId="myValidator" disabled="#{bean.checkedSelectOneRadioValue == 'TEST'}" />
</h:inputText>
Смотри также showcase example и source code, из которого экстракт уместности размещен ниже:
@Override
public void apply(FaceletContext context, UIComponent parent) throws IOException {
if (!ComponentHandler.isNew(parent)) {
return;
}
final javax.faces.validator.Validator validator = createValidator(context);
final RenderTimeAttributes attributes = collectRenderTimeAttributes(context, validator);
final ValueExpression disabled = getValueExpression(context, "disabled", Boolean.class);
((EditableValueHolder) parent).addValidator(new javax.faces.validator.Validator() {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (disabled == null || Boolean.FALSE.equals(disabled.getValue(context.getELContext()))) {
attributes.invokeSetters(context.getELContext(), validator);
validator.validate(context, component, value);
}
}
});
}
Ваш чек на внешний вид инвалидов несколько подозрительными, не должен он быть # {myBean.checkedSelectOneRadioValue == 'TEST'} "или это просто опечатка (перемещенная фигурная скобка)? – Volker
Я тоже пробовал вашу версию, и она не работает. Может быть, что в этот момент проверки значение из SelectOneRadio не сохраняется в bean? – Tobi
Попробуйте установить partialSubmit = "true" в теге selectOneRadio, который должен подсчитать значение. – Volker