2 Replies Latest reply on May 3, 2009 5:35 AM by nbelaevski

    Validation Issue with RF3.30

      Hi!
      First of all, I want to say how much I like RichFaces, it's really an awesome component collection and I really do like to work with them.
      However, today I expierience some issues when I use some input validation features, mainly I do not get any responses by the validation components, regardless if I'm using standard validators like f:validateLength or my custom ValidationClass. I know, that the validation method is called as the Tomcat output confirms that.

      here's my jsp file:

      <%@ page language="java" contentType="text/html; charset=US-ASCII"
       pageEncoding="US-ASCII"%>
      <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
      <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
      <%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
      <%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
      <f:view>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
       <head>
       <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
       <title>Tippspiel - Register</title>
       </head>
       <body>
       <a4j:form>
       <rich:panel header="Registration Form">
       <h:panelGrid columns="3">
       <h:outputLabel for="inUsername" value="Username*"/>
       <h:inputText id="inUsername" value="#{userRegistration.username}" required="true">
       <f:validator validatorId="UsernameValidator"/>
       <a4j:support event="onkeyup" eventsQueue="usernameQueue" requestDelay="500" reRender="inUsernameMsg"/>
       </h:inputText>
       <h:message for="inUsername" id="inUsernameMsg" />
       <h:outputLabel for="inFirstname" value="Firstname*"/>
       <h:inputText id="inFirstname" value="#{userRegistration.firstname}" required="true">
       <f:validateLength minimum="2" maximum="32"/>
       <a4j:support event="onblur" reRender="inFirstnameMsg"/>
       </h:inputText>
       <h:message for="inFirstname" id="inFirstnameMsg"/>
       <h:outputLabel for="inLastname" value="Lastname*"/>
       <h:inputText id="inLastname" value="#{userRegistration.lastname}" required="true">
       <f:validateLength minimum="2" maximum="32"/>
       <a4j:support event="onblur" reRender="inLastnameMsg" />
       </h:inputText>
       <h:message for="inLastname" id="inLastnameMsg"/>
       <h:outputLabel for="inEmail" value="E-Mail*"/>
       <h:inputText id="inEmail" value="#{userRegistration.email}" required="true">
       <f:validator validatorId="eMailValidator"/>
       <a4j:support event="onblur" reRender="inEmailMsg"/>
       </h:inputText>
       <h:message for="inEmail" id="inEmailMsg"/>
       <h:outputLabel for="inPassword" value="Password*"/>
       <h:inputSecret id="inPassword" value="#{userRegistration.password}" required="true"/>
       <h:message for="inPassword"/>
       <h:outputLabel for="inPasswordConfirm" value="Password (confirm)*"/>
       <h:inputSecret id="inPasswordConfirm" value="#{userRegistration.passwordConfirm}" required="true"/>
       <h:message for="inPasswordConfirm"/>
       </h:panelGrid>
       <a4j:commandButton action="submit" value="Register"></a4j:commandButton>
       </rich:panel>
       </a4j:form>
       </body>
      </html>
      </f:view>
      

      and here's my custom validation method:

      public void validate( FacesContext context, UIComponent component, Object value )
       throws ValidatorException {
       String username = (String)value;
       System.out.println("Checking Username `"+username+"`");
       this.db = new MySQL("testuser","testpassword","192.168.5.254");
       this.db.connect();
       this.db.selectDatabase("db_name");
       PreparedStatement stmt = this.db.createPreparedStatement(SQL_CHECK_USERNAME);
       try {
       stmt.setString(1, username);
       stmt.execute();
       ResultSet rs = stmt.getResultSet();
       rs.next();
       if( rs.getString("amount").equals("1")) {
       FacesMessage fm = new FacesMessage();
       fm.setSeverity(FacesMessage.SEVERITY_ERROR);
       fm.setDetail("Username already exsists!");
       fm.setSummary("Username exsists!");
       System.out.println(fm.getDetail());
       throw new ValidatorException(fm);
       }
       } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       }
       }
      


      since the validation method is called properly, I don't paste my faces-config.xml.

      Thank you for your help! Any help is very appreciated!

      cu
      tuxbox

        • 1. Re: Validation Issue with RF3.30

          ok, i've solved the issue now. I thought it would be enough to wrap everything in a <a4j:form> tag.
          Apparently I was wrong. Now I wrapped <h:message> tags in <a4j:outputPanel id="{id}"> tags and rerender those with a4j:support. This fixed it for me!

          cu
          tuxbox

          • 2. Re: Validation Issue with RF3.30
            nbelaevski

            Hello tuxbox,

            You can wrap h:message into

            <a4j:outputPanel ajaxRendered="true">...</a4j:outputPanel>
            and you won't have to re-render it then or use rich:message component.