1

私は ah:form に使用する複合コンポーネント (実際にはキャプチャ) を持っています。
h:form の送信ボタンをクリックすると、次のエラーが表示されます。

1月16日 2013 10:02:06 javax.faces.validator.BeanValidator 検証
注意: 空の値を持つコンポーネントを検証できません: captcha:captchaText

キャプチャの複合コンポーネントの xhtml コードは次のとおりです。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
  xmlns:composite="http://java.sun.com/jsf/composite" xmlns:xcc="http://java.sun.com/jsf/composite/components">
<h:body>

  <composite:interface>
    <composite:attribute name="id" type="java.lang.String" />
    <composite:attribute name="imageWidth" type="java.lang.Integer" />
    <composite:attribute name="imageHeight" type="java.lang.Integer" />
    <composite:attribute name="imageClass" type="java.lang.String" />
    <composite:attribute name="inputClass" type="java.lang.String" default="" />
    <composite:attribute name="placeholder" type="java.lang.String" default="" />
    <composite:attribute name="failureMessage" type="java.lang.String" default="Captcha validation failed" />

    <composite:editableValueHolder name="captchaText" />
  </composite:interface>

  <composite:implementation>
    <h:inputText id="captchaText" required="true" styleClass="#{cc.attrs.inputClass}" placeholder="#{cc.attrs.placeholder}"
      autocomplete="off" maxlength="10">
      <f:param name="failureMessage" value="#{cc.attrs.failureMessage}" />
      <f:validateLength minimum="6" />
      <f:validator validatorId="captchaValidator" />
    </h:inputText>
    <h:graphicImage id="captchaImage" alt="" style="margin-left:3px;" styleClass="#{cc.attrs.imageClass}" width="#{cc.attrs.imageWidth}"
      height="#{cc.attrs.imageHeight}" value="__captcha.jpg" />
  </composite:implementation>

</h:body>
</html>

Captcha の JSF Validator コードは次のとおりです。

import javax.faces.application.FacesMessage;


import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import net.paissad.waqtsalat.servlet.CaptchaServlet;

    @FacesValidator(CaptchaValidator.VALIDATOR_ID)
    public class CaptchaValidator implements Validator {

    public static final String VALIDATOR_ID = "captchaValidator";

    @Override
    public void validate(final FacesContext context, final UIComponent component, final Object value) throws ValidatorException {

        final String enteredValue = (String) value;
        final String expectedValue = (String) context.getExternalContext().getSessionMap()
            .get(CaptchaServlet.CAPTCHA_KEY);

        final boolean ok = (enteredValue != null) && (enteredValue.equals(expectedValue));
        if (!ok) {
            String summary = (String) component.getAttributes().get("failureMessage");
             if (summary == null) summary = "";
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, summary));
        }
    }

}

実際のキャプチャ イメージを構築する CaptchaServlet のコードを表示する必要はありません。私が言えることは、それがうまく機能するということだけです。このコードhereからインスピレーションを得ました。

これが基本的に、私のフォームで複合コンポーネントをどのように使用したかです。(これは私の実際の使用例ではありません)

<h:form>
    <xcc:captcha id="captcha" imageClass="img-rounded" placeholder="#{i18n.Captcha_enter_code_here}" failureMessage="Captcha validation failed" />
    <h:commandButton styleClass="btn btn-success" type="submit" value="#{i18n.Submit}"
            actionListener="#{accountRegistrationController.register}" action="success" />
</h:form>

フォームは次のようにレンダリングされます (フランス語にローカライズされています)。

ここに画像の説明を入力

複合コンポーネント + バリデーター + サーブレット
を使用することを好みます。Captcha の入力値を検証するメソッドでコントローラー Bean (@Named / @RequestScoped) を使用することは避けたいと思います。

Eclipse で Validator コードをデバッグすると、コードは正しく動作します。唯一の問題は、コードの次の部分がキャプチャのコンポーネントから「failureMessage」属性を取得しないことです。どうすればこれを解決できますか? 常にヌルです。

String summary = (String) component.getAttributes().get("failureMessage");

では、どうすれば Bean 検証の問題を解決できますか?
Validator で属性 'failureMessage' を正しく取得するにはどうすればよいですか?

私はたくさんのものを試しましたが、今はあなたに頼っています。
助けてくれてありがとう。

PS:私は現在TomEE 1.5+、Java6を使用しています。

4

1 に答える 1

1

inputText タグに value 属性がないようです。value 属性は、入力と Bean の間のバインドを行います。

<h:inputText value="#{yourBean.yourValue" ...
于 2013-01-16T11:24:33.463 に答える