Редактор свойств не зарегистрирован с ошибкой PropertyEditorManager в пользовательском теге проверки (Java) - PullRequest
0 голосов
/ 07 декабря 2009

Я использую TomCat 5.5 с MyFaces 1.1 и пытаюсь реализовать собственный тег проверки регулярных выражений.

Мой класс 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;
}
}

Мой дескриптор Taglibrary выглядит так:

<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: невозможно преобразовать строку «[\ d {4}]» в класс «javax.el.ValueExpression« для атрибута » регулярное выражение ": редактор свойств не зарегистрирован в PropertyEditorManager

Вызвано: org.apache.jasper.JasperException - Невозможно преобразовать строку "[\ d {4}]" в класс "javax.el.ValueExpression" для атрибута "regex": Редактор свойств не зарегистрирован в PropertyEditorManager

Я надеюсь, что предоставил достаточно информации, чтобы кто-нибудь помог мне с этим ...

1 Ответ

1 голос
/ 20 декабря 2010

У меня, похоже, такая же проблема, как и у вас, я пытаюсь найти решение, но, похоже, проблема в том, что при использовании библиотек JSF Tomcat или сервера приложений (WebSphere Application Server 7.0) моя проблема в том, что новое приложение На сервере есть новые библиотеки JSF (1.2) вместо библиотек 1.1, которые были у моего старого сервера приложений. (Версия 6.1)

Чтобы быть более конкретным. моя проблема описана здесь. http://www -01.ibm.com / поддержка / docview.wss? UID = swg21318801

...