Передача параметра в валидатор составного компонента - PullRequest
0 голосов
/ 02 июля 2018

Я использую Мохарру 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"));
}

}

Есть две проблемы:

  1. Параметр "allSupportedLanguages" (который является List<String>) пуст, когда я пытаюсь получить его в валидаторе.
  2. 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"/> внутри составного компонента.

...