4

新しいバリデータを作成しました:

package com.example.jsf.validator;

import com.example.components.LoginFormValue;
import com.example.ejb.SecurityEjb;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;

/**
 * Validator for {@code login-form} component.
 *
 * @author steve
 */
@Named
@ApplicationScoped
public class LoginValidator implements Validator, Serializable
{
    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
    {
        if (value == null)
        {
            return;
        }

        LoginFormValue loginFormValue = (LoginFormValue) value;
        if (securityEjb.checkCredentials(loginFormValue.getEmailAddress(), loginFormValue.getPassword())) {
            return;
        }

        throw new ValidatorException(new FacesMessage("Incorrect email address/password"));
    }

    @EJB
    private SecurityEjb securityEjb;
}

しかし、私がそれを使用しようとすると:

<my:login-form emailAddress="#{loginBean.emailAddress}"
               rememberMe="#{loginBean.rememberMe}"
               actionListener="#{loginBean.submit()}"
               recoverPasswordOutcome="recover-password"
               registerOutcome="signup">
    <f:validator validatorId="#{loginValidator}"/>
</my:login-form>

ページをロードすると、次の例外が表示されます。

javax.faces.FacesException: Expression Error: Named Object: com.example.jsf.validator.LoginValidator@31888ef8 not found.

問題のあるコード行は次のとおりです。

com.sun.faces.application.ApplicationImpl.createValidator(ApplicationImpl.java:1593)

JSF がバリデーター Bean クラスを実際に解決できるのに、インスタンス化できないのはなぜですか? 私のアプリの他のすべてのバリデーターはNamed ApplicationScopedBean であり、すべて正常に動作します。を使用してそれらすべてを参照します<f:validator validatorId="{myValidatorBean}"/>

GlassFish 3.1.2 を使用しています。

4

2 に答える 2

10

<f:validator validatorId>は、具体的なバリデータ インスタンスではなく、バリデータの ID を参照する必要があります。@FacesValidatorバリデーターの ID は、値として、またはアプローチ<validator-id>を使用するときに指定したものとまったく同じです。faces-config.xml例えば

@FacesValidator("myValidator")

これは次のように参照されます

<f:validator validatorId="myValidator" />

内の EL 式はvalidatorId、ビューのビルド時にStringバリデーター ID を識別するものに解決されます。したがって、具体的なValidatorインスタンスを渡すと、例外メッセージが伝えようとしているように、最終的に存在しないバリデータ ID として渡されるtoString()ような値になります。com.example.MyValidator@hashcode

javax.faces.FacesException: 式エラー: 名前付きオブジェクト: com.example.jsf.validator.LoginValidator@31888ef8 が見つかりません。

代わりに<f:validator binding>orを使用する必要があります。<h:inputText validator>具体的なインスタンスを取ることができます。

<f:validator binding="#{myValidator}" />

複合コンポーネントに渡されたときに機能しないことは別の問題です。つまり、属性をまったく指定しなかったため、コンポジット内のforどのコンポーネントにも適用されません。UIInputそれを解決するために、次の質問/回答が完全に適用できると思います:複合コンポーネント内の入力コンポーネントのバリデータを指定する方法は?

于 2012-06-09T21:03:40.750 に答える