2

私の英語は下手です。申し訳ありません。私の質問は jsf の検証に関するものです。検証 Bean が ValidatorException をスローすると、マネージド Bean の save_method が機能します。しかし、save_method が機能することは望ましくありません。

複合インターフェース

<composite:attribute name="validator" required="false"
        method-signature="void Action(javax.faces.context.FacesContext, javax.faces.component.UIComponent,Object)" />

そのような複合実装

<c:if test="#{cc.getValueExpression('validator')!=null}">
<p:inputText value="#{cc.attrs.value}" id="#{cc.attrs.id}"
required="#{cc.attrs.required}" validator="#{cc.attrs.validator}"/>

検証 Bean のメソッドを検証します。

@Override
public void validate(FacesContext context, UIComponent component, Object value) throws    ValidatorException {
String email = (String) value;
Pattern mask = null;
mask = Pattern.compile(EMAIL_REGEX);
Matcher matcher = mask.matcher(email);

if (!matcher.matches()) {
    messageManager.warn(MessageManager.Bundles.WO, "validator.message.email");

   throw new ValidatorException(new FacesMessage("hoppala"));
}
}

マネージドBeanの保存方法。

 @Override
    public boolean save() {
       super.save();
}
4

1 に答える 1

3

バージョン2.1.10より前のmojarraを使用していますか?最近修正されたバグがありました。したがって、可能であれば、最新の2.1.13に更新してください。しかしとにかく、JSFではあなたはそれをあなたがそれを説明したようにしないでしょう。次のように、を使用してバリデーターを適用することをお勧めします<f:validator/>

<mytags:customInput value="#{validationModel.value}">
   <f:validator for="input" validatorId="org.validationexample.EmailValidator" />
</mytags:customInput>

そして、複合コンポーネントは以下を実装する必要があります<cc:editableValueHolder>

<cc:interface>
    <cc:attribute name="value"/>
    <cc:editableValueHolder name="input" targets="inputText"/>
</cc:interface>

<cc:implementation>
    <p:inputText id="inputText" value="#{cc.attrs.value}" />
</cc:implementation>

そして最後に、検証は専用のバリデータークラスによって処理されます。

@FacesValidator("org.validationexample.EmailValidator")
public class EmailValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // your validation here
    }

}

とにかく、他のアプローチ/フレーバーもあります。<f:validator>内の複合コンポーネントに直接配置することもできます<p:inputText><f:validator>属性があるのでdisabled、オンデマンドで無効にすることができます。もう1つのアプローチは、Bean Validationを使用して、 HibernateValidatorに付属している既存のEmailValidatorを使用することです。その場合は、プロパティの上にアノテーション@Emailを設定する必要があります。

于 2012-09-15T22:50:25.527 に答える