Я использую Мохарру 2.3.0.
У меня есть составной компонент, который содержит inputText. Я хочу иметь возможность проверить этот inputText с помощью FacesValidator. Кроме того, я хочу передать определенные параметры в валидатор.
Компонент My Composite определяется следующим образом:
<composite:interface>
...
<composite:editableValueHolder name="inputValidator" targets="value" />
...
</composite:interface>
<composite:implementation>
...
<h:panelGroup layout="block" styleClass="col-sm-10">
<h:inputText id="value"
disabled="#{cc.attrs.disabled}"
value="#{cc.attrs.value}"
styleClass="form-control"
required="#{cc.attrs.required}"
onchange="#{cc.attrs.onChange}"
/>
</h:panelGroup>
...
</composite:implementation>
Я использую компонент таким образом и объявил атрибут f: validator и f: (который должен быть передан в валидатор)
<uiComps:field labelText="add language"
id="languages"
autocompleteValues="#{ocrEngineViewModel.getAllSupportedLanguages()}" >
<f:ajax event="onChange" listener="#{ocrEngineViewModel.updateSelectedLanguages}" render="newParameter:languages:value newParameter:usedLanguages" />
<f:validator validatorId="OcrLanguageValidator" for="inputValidator" />
<f:attribute name="allSupportedLanguages" value="#{ocrEngineViewModel.allSupportedLanguages}"/>
</uiComps:field>
<h:message for="languages" />
Мой валидатор выглядит так:
@FacesValidator("OcrLanguageValidator")
public class OcrLanguageValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
Object allSupportedLanguages = component.getAttributes().get("allSupportedLanguages");
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "lala", "not good"));
}
}
Есть две проблемы:
- Параметр "allSupportedLanguages" (который является
List<String>
) пуст, когда я пытаюсь получить его в валидаторе.
- ValidationException, который содержит FaceMessage, не отображается в области сообщений для компонента. Я не вижу никакой информации о сообщении на странице.
Обновление:
Вместо составного компонента я помещаю код прямо на мою страницу.
<h:panelGroup layout="block" styleClass="col-sm-10">
<h:inputText id="value" styleClass="form-control">
<f:ajax event="change" listener="#{ocrEngineViewModel.updateSelectedLanguages}" render="newParameter:languages:value newParameter:usedLanguages" />/>
<f:validator validatorId="OcrLanguageValidator"/>
<f:attribute name="allSupportedLanguages" value="#{ocrEngineViewModel.allSupportedLanguages}"/>
</h:inputText>
</h:panelGroup>
Это работает, и я вижу атрибут в валидаторе. Поэтому я думаю, что проблема заключается в использовании составного компонента.
Update2:
Мне удалось решить проблему с сообщением об ошибке проверки. Я поместил <h:message for="value"/>
внутри составного компонента.