1

CDI とデータソースを使用できるカスタム バリデータを実装したいと考えています。私はこのコードをテストしました:

<h:panelGroup>Session ID</h:panelGroup>
<h:panelGroup>
    <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" >
        <f:validateLength minimum="0" maximum="15"/>
        <f:validator validatorId="ValidatorController" >
        </f:validator>
        <f:ajax event="blur" render="sessionidMessage" />                                          
    </h:inputText>
    <h:message id="sessionidMessage" for="sessionid" />
</h:panelGroup>

これはバリデータです:

    @FacesValidator("ValidatorController")

    public class FormValidator implements Validator {

        public FormValidator() {
        }

        @Override
        public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            if (value.equals("test")) {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  Session ID is already in use, please choose another.", null));
            }
        }
}

このコードは正常に動作します。また、バリデーターで CDI を使用するために、次のコードを実装しようとしました。

<h:panelGroup>Session ID</h:panelGroup>
<h:panelGroup>
    <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" >
        <f:validateLength minimum="0" maximum="15"/>
        <f:validator binding="#{ValidatorController}" >
            <f:attribute name="type" value="sessionid" />
        </f:validator>
        <f:ajax event="blur" render="sessionidMessage" />                                          
    </h:inputText>
    <h:message id="sessionidMessage" for="sessionid" />
</h:panelGroup>

これはバリデータです:

@Named("ValidatorController")

public class FormValidator implements Validator {

    public FormValidator() {
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value.equals("test")) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "  Session ID is already in use, please choose another.", null));
        }
    }

}

何らかの理由で、2 番目の例が機能しません。

4

1 に答える 1

0

より具体的に説明する必要があります。何が失敗しますか? コンパイルされませんか?動かない?例外とは何ですか。また、2番目のケースで何を達成しようとしているのかも明確ではありません。

一般に、f:attribute をネストして f:validator に属性を渡すことはできません。コードを次のようにします。

<f:validator binding="#{ValidatorController}" (session id in your case) />
<f:attribute name="type" value="sessionid" />

後で、コンポーネント パラメータ Map 内のコンポーネント パラメータ検索できます。

context.getExternalContext().getRequestParameterMap();
于 2012-06-07T15:15:35.680 に答える