2009-12-07 4 views
0

J'utilise TomCat 5.5 avec MyFaces 1.1 et j'essaie d'implémenter une balise de validation regex personnalisée.L'éditeur de propriétés n'est pas enregistré avec l'erreur PropertyEditorManager sur la balise de validation personnalisée (java)

Ma classe RegExValidator ressemble à ceci:

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

Ma classe RegExValidatorTag ressemble à ceci:

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

Mon taglibrary Descriptor ressemble à ceci:

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

Mon visage commun -config.xml a une balise Validator comme ceci:

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

Et plus tard il est censé être utilisé dans un fichier jsp comme ceci:

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

Lorsque vous appelez la page, l'erreur suivante apparaît:

javax.servlet. ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: Impossible de convertir la chaîne "[\ d {4}]" en classe "javax.el.ValueExpression" pour l'attribut "regex": l'éditeur de propriétés n'est pas enregistré avec le PropertyEditorManager

Causée par: org.apache.jasper.JasperException - Impossible de convertir la chaîne "[\ d {4}]" en classe "javax.el.ValueExpression" pour l'attribut "regex": Property Editor non enregistré dans PropertyEditorManager

J'espère fourni suffisamment de détails pour que quelqu'un me aider sur ce ...

+0

J'ai répondu à votre question car la seule réponse ne m'aide pas, et les balises d'origine n'ont pas ciblé le cœur de ce problème. (Je reçois une erreur similaire et j'essaie de le réparer - en utilisant J2EE 1.4, c'est JSP-2.0) – Alberto

+0

Eh bien, non, mon intuition était encore une fois fausse. Je faisais face à un problème différent qui était lié à la syntaxe que j'utilisais pour définir un attribut pour un tag personnalisé. Je dois admettre que je ne sais pas vraiment quelle était la cause de votre erreur (ancienne), car je ne suis toujours pas familiarisé avec ces validateurs. – Alberto

+0

J'espère également que je n'ai pas supprimé trop de vos tags: je crois maintenant que le [tag: myfaces] pourrait en effet être approprié. Si oui, s'il vous plaît rollback mes modifications (au moins, cette suppression) – Alberto

Répondre

1

Il me semble avoir un problème similaire comme la vôtre, je suis en train de trouver la solution, mais il semble que le problème lorsque j'utilise Tomcat ou les bibliothèques JSF du serveur d'applications (WebSphere Application Server 7.0), mon problème est que le nouveau serveur d'applications a de nouvelles bibliothèques JSF (1.2) au lieu des bibliothèques 1.1 de mon ancien serveur d'applications avait. (Version 6.1)

Pour être plus précis. mon problème est décrit ici. http://www-01.ibm.com/support/docview.wss?uid=swg21318801

Questions connexes