0 Replies Latest reply on Sep 18, 2008 2:54 PM by Bernix Ning

    SeamELResolver vs javax.el.ELResolver

    Bernix Ning Newbie

      We have a collection of objects(entities) which has their own validation pattern, so we have to develop a custom JSF validator for them.


      The problem is, when we trying to set the validator's property with a EL expression, this expression can not be resolvered exactly, and not getting the correct value in the custom validator.


      I doubt it's because the ELContext can't find the Seam context, so that the seam component can not be resolvered.


      Here's my code:


      MyEntity.java


      @Entity
      public class MyEntity implements Serializable {
          // other fields
          private String valuePattern;
              private String value;
              // getters and setters
      }



      RegexValidator.java


      @Name("company.regexValidator")
      @BypassInterceptors
      @Validator
      public class RegexValidator implements javax.faces.validator.Validator, Serializable {
              @Logger Log log;
              private String expression;
              private String errorMessage;
              
              public void validate(FacesContext context, UIComponent component, Object value)
                              throws ValidatorException {
                      log.info(">>>> validating regex [#0]", expression);
                      // compile the regex expression and matches the value
              }
              // setters for the "expression" and "errorMessage"
      }



      company.taglib.xml


      <?xml version="1.0"?>
      <!DOCTYPE facelet-taglib PUBLIC
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
        "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
      <facelet-taglib>
          <namespace>http://www.company.com/taglib</namespace>
          <tag>
              <tag-name>validateRegex</tag-name>
              <validator>
                  <validator-id>company.regexValidator</validator-id>
              </validator>
          </tag>
      </facelet-taglib>



      MyBean.java


      @Name("myBean")
      @Scope(PAGE)
      public class MyBean {
              // other business logic
              public List<MyEntity> getMyEntities() {
                      // generate the entities
              }
      }



      myBeanEdit.xhtml


      ...
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:my="http://www.company.com/taglib"
      ...
      <ui:repeat value="#{myBean.myEntities}" var="myEntity">
              <h:inputText value="#{myEntity.value}">
                      <my:validateRegex expression="#{myEntity.valuePattern}">
              </h:inputText>
      </ui:repeat>



      web.xml


      ...
              <context-param>
              <param-name>facelets.LIBRARIES</param-name>
              <param-value>/WEB-INF/company.taglib.xml</param-value>
          </context-param>
      ...



      The log from the validator is >>>> validating regex [], I guess it's because the expression EL can not be resolvered correctly,
      and I change the code to be:


      ...
      <my:validateRegex expression="[a-zA-Z]*"/>
      ...



      it works fine.


      then I try:


      @Name("myBean")
      @Scope(PAGE)
      public class MyBean {
              // other business logic
              public String getRegex() {
                      return "[0-9]*";
              }
      }
      
      <my:validateRegex expression="#{myBean.regex}">



      works fine too....


      Then I try to change the faces-config.xml:


      ...
          <application>
              <el-resolver>org.jboss.seam.el.SeamELResolver</el-resolver>
          </application>
      ...


      Just doesn't work... the expression still can not be resolvered...


      My project was generated by seam-gen, Seam 2.0.2SP1, JBoss 4.2.2GA.


      how can I resolver this valuePattern exactly in the validator? or may be I should write a tag class? like:


      public class RegexValidatorTag extends ValidatorELTag {
              private ValueExpression expression;
              
              public Validator createValidator() throws JspException {
                      ELContext elContext = FacesContext.getCurrentInstance().getELContext();
                      // how to use SeamELResolver to resolver the expression here?
                      RegexValidator validator = new RegexValidator();
                      validator.setExpression((String)expression.getValue(elContext));
              }
      }



      Any comments will be greatful,


      Regards.