0

MyFaces 1.1 で TomCat 5.5 を使用しており、カスタム正規表現検証タグを実装しようとしています。

私の RegExValidator クラスは次のようになります。

public class RegExValidator implements Validator, StateHolder {
  private String regex;
  private boolean transientValue = false;

  public RegExValidator() {
    super();
  }

  public RegExValidator(String regex) {
    this();
    this.regex = regex;
  }

  public void validate(FacesContext context, UIComponent component, Object toValidate) throws ValidatorException {

    if ((context == null) || (component == null)) {
throw new NullPointerException();
    }
    if (!(component instanceof UIInput)) {
        return;
    }
    if (null == regex || null == toValidate) {
        return;
    }

    String val = (String) toValidate;

    if (!val.matches(regex)) {
        FacesMessage errMsg = MessageFactory.createFacesMessage(context, Constants.FORMAT_INVALID_MESSAGE_ID, FacesMessage.SEVERITY_ERROR, (new Object[]{regex}));
        throw new ValidatorException(errMsg);
    }
}

public Object saveState(FacesContext context) {
    Object[] values = new Object[1];
    values[0] = regex;

    return (values);
}

public void restoreState(FacesContext context, Object state) {
    Object[] values = (Object[]) state;
    regex = (String) values[0];
}

public String getRegex() {
    return regex;
}

public void setRegex(String regex) {
    this.regex = regex;
}

public boolean isTransient() {
    return transientValue;
}

public void setTransient(boolean transientValue) {
    this.transientValue = transientValue;
}
}

私の RegExValidatorTag クラスは次のようになります。

@SuppressWarnings("serial")
public class RegExValidatorTag extends ValidatorELTag {

private static String validatorID = null;
protected ValueExpression regex = null;

public RegExValidatorTag() {
    super();

    if (validatorID == null) {
        validatorID = "RegExValidator";
    }
}

public Validator createValidator() throws JspException {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    RegExValidator result = null;

    if (validatorID != null) {
        result = (RegExValidator) facesContext.getApplication().createValidator(validatorID);
    }

    String patterns = null;

    if (regex != null) {
        if (!regex.isLiteralText()) {
            patterns = (String) regex.getValue(facesContext.getELContext());
        } else {
            patterns = regex.getExpressionString();
        }
    }

    result.setRegex(patterns);

    return result;
}

public void setValidatorID(String validatorID) {
    RegExValidatorTag.validatorID = validatorID;
}

/**
 * @param regex
 *            the regex to set
 */
public void setRegex(ValueExpression regex) {
    this.regex = regex;
}
}

私のタグライブラリ記述子は次のようになります。

<tag>
    <name>regexValidator</name>
    <tag-class>com.company.components.taglib.RegExValidatorTag</tag-class>
    
    <attribute>
        <name>regex</name>
        <required>true</required>       
        <rtexprvalue>false</rtexprvalue>    
    </attribute>    
</tag>

私の face-common-config.xml には、次のような Validator タグがあります。

<validator>
    <description>
        Validate an input string value against a regular
        expression specified by the "regex" attribute.
    </description>
    <validator-id>RegExValidator</validator-id>
    <validator-class>com.company.components.validators.RegExValidator</validator-class>
    <attribute>
        <description>
            The regular expression to test the value against
        </description>
        <attribute-name>regex</attribute-name>
        <attribute-class>java.lang.String</attribute-class>
    </attribute>        
</validator>

そして後で、次のようなjspファイルで使用されることになっています:

<tc:in value="${dataBean.currentBean.field}">
  <a:regexValidator regex="${dataBean.currentBean.validationRegEx}" />
</tc:in>

ページを呼び出すと、次のエラーが表示されます。

javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: 属性 "regex" の文字列 "[\d{4}]" をクラス "javax.el.ValueExpression" に変換できません:プロパティ エディタが PropertyEditorManager に登録されていません

原因: org.apache.jasper.JasperException - 属性 "regex" の文字列 "[\d{4}]" をクラス "javax.el.ValueExpression" に変換できません: プロパティ エディタが PropertyEditorManager に登録されていません

誰かがこれについて私を助けるのに十分な詳細を提供したことを願っています...

4

1 に答える 1

1

私はあなたと同じような問題を抱えているようです。解決策を見つけようとしていますが、問題は Tomcat またはアプリケーション サーバー (WebSphere Application Server 7.0) JSF ライブラリを使用する場合にあるようです。私の問題は、新しいアプリケーション サーバーに新しい古いアプリケーション サーバーにあった 1.1 ライブラリの代わりに JSF ライブラリ (1.2)。(バージョン 6.1)

もう少し詳しく言うと。私の問題はここで説明されています。http://www-01.ibm.com/support/docview.wss?uid=swg21318801

于 2010-12-20T16:14:08.633 に答える