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}"/>

Javaコード

@ManagedBean

パブリッククラスTestValidator{

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

PropertyNotFoundException:

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

この問題を解決する方法は?私の最後の方法:

4

2 に答える 2

6

これは確かに機能しません。<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 に答える