1

JSF 自定义复合组件 input.xhtml

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

<cc:implementation>
    <h:inputText validator="#{cc.attrs.validator}"/>
</cc:implementation>

*.xhtml

<l:input value = ... validator="#{testValidator.validator}"/>

爪哇代码

@ManagedBean

公共类 TestValidator {

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

属性未发现异常:

validator="#{testValidator.validator}": The class 'TestValidator' does not have the property 'validator'.

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

4

2 回答 2

6

这确实行不通。为了将验证器附加到复合指定的输入组件,您需要首先将输入组件注册为 a <cc:editableValueHolder><cc:interface>

<cc:interface>
    <cc:editableValueHolder name="yourInputName" targets="yourInputId" />
</cc:interface>
<cc:implementation>
    <h:inputText id="yourInputId" ... />
</cc:implementation>

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

<l:input>
    <f:validator validatorId="myValidator" for="yourInputName" />
</l:input>

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

@FacesValidator("myValidator")
public class MyValidator implements Validator {
    // ...
}

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

于 2012-08-20T11:49:24.230 回答
1

您需要定义一个 cc:attribute "validator"targets属性:

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

<cc:implementation>
    <h:inputText id="inputId"/>
</cc:implementation>

(请注意,我没有在 h:inputText 中定义验证器属性)

只要您不为复合组件实现组件类,这很容易。好吧......即使那样它也很容易,但如果你的组件类扩展它就行不通了UIInput。如果它扩展UINamingComponent类,它就可以工作(我不确定这是否是最好的解决方案,或者你是否可以让它与 UIInput 一起工作但它可以工作)。

所以如果你想拥有自己的组件类,试试这个:

<cc:interface componentType="myComponent>
    <cc:attribute name="validator" targets="inputId"/>
</cc:interface>

<cc:implementation>
    <h:inputText id="inputId"/>
</cc:implementation>
@FacesComponent("myComponent")
public class MyComponent extends UINamingContainer {

    @Override
    public String getFamily() {
        return UINamingContainer.COMPONENT_FAMILY;
    }

    //your code here

}
于 2016-09-08T09:25:50.883 回答