将参数传递给复合组件的验证器

时间:2018-07-02 13:22:50

标签: jsf-2 composite-component custom-validators

我正在使用Mojarra 2.3.0。 我有一个包含inputText的复合组件。我希望能够使用FacesValidator验证此inputText。此外,我想将某些参数传递给验证器。

我的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:attribute(应将其传递给验证器)

<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. 包含FaceMessage的ValidationException未显示在组件的消息区域中。我在页面上看不到有关该消息的任何信息。

更新

我将代码而不是复合组件直接放入页面中。

<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"/>放在了复合组件中。

0 个答案:

没有答案