views:

987

answers:

1

Hello,

I am using TomCat 5.5 with MyFaces 1.1 and am trying to implement a custom regex validation tag.

My RegExValidator class looks like this:

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;
}
}

My RegExValidatorTag class looks like this:

@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;
}
}

My Taglibrary Descriptor looks like this:

<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>

My face-common-config.xml has a Validator tag like this:

<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>

And later on it is supposed to be used in a jsp file like this:

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

When calling the page, the following error comes up:

javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: Unable to convert string "[\d{4}]" to class "javax.el.ValueExpression" for attribute "regex": Property Editor not registered with the PropertyEditorManager

Caused by: org.apache.jasper.JasperException - Unable to convert string "[\d{4}]" to class "javax.el.ValueExpression" for attribute "regex": Property Editor not registered with the PropertyEditorManager

I hope I provided enough details for someone to help me out on this...

A: 

Did you find a solution?!

Peter Wippermann