验证器方法在JSF自定义组合组件中不起作用

1 validation methods jsf composite-component

JSF自定义复合组件input.xhtml

<cc:interface>
    <cc:attribute name="validator"/>
</cc:interface>

<cc:implementation>
    <h:inputText validator="#{cc.attrs.validator}"/>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

*.xhtml

<l:input value = ... validator="#{testValidator.validator}"/>
Run Code Online (Sandbox Code Playgroud)

java代码

@ManagedBean

公共类TestValidator {

    public void validator(FacesContext context, UIComponent component, Object value) throws ValidatorException {
         System.out.println("Call validator");
    }
}
Run Code Online (Sandbox Code Playgroud)

PropertyNotFoundException:

validator="#{testValidator.validator}": The class 'TestValidator' does not have the property 'validator'.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢?我最后的方式:

Bal*_*usC 5

这确实无法奏效.为了验证器附连到由所述复合所指定的输入部件,则需要输入组件注册为 <cc:editableValueHolder><cc:interface>第一.

<cc:interface>
    <cc:editableValueHolder name="yourInputName" targets="yourInputId" />
</cc:interface>
<cc:implementation>
    <h:inputText id="yourInputId" ... />
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

这样,<f:validator for="yourInputName">复合组件声明中嵌套的任何内容都将应用于所需的输入组件.

<l:input>
    <f:validator validatorId="myValidator" for="yourInputName" />
</l:input>
Run Code Online (Sandbox Code Playgroud)

您只需要通过真正的独立Validator实现替换紧耦合验证器方法.

@FacesValidator("myValidator")
public class MyValidator implements Validator {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

注意:标准JSF验证器(如<f:validateLength>,<f:validateRequired>等)也都具有for用于此目的的属性.