3 Replies Latest reply on Aug 13, 2007 11:55 PM by monkeyden

    validation

      I have a field, which has an unique constraint in the database. I am getting an Hibernate UniqueConstraint exception.

      I would like to asynchronously query the database as the user is entering the form and inform that the entry violates the unique constraint.

      How can I write a validator in Seam that will be invoked by s:validate on the field.

      Any pointers would be helpful.

      Thanks,

      M

        • 1. Re: validation
          fernando_jmt

          I see three options:

          A) To catch the Exception in your code and then show the respective message.

           public void create(Object entity) throws MyDuplicatedException {
           try {
           em.persist(entity);
           em.flush();
           } catch (EntityExistsException e) {
           throw new MyDuplicatedException();
           }
           }
          
          

          B) To use @Validator and @Name enabling a JSF Validator as Seam component.
          @Name("equalValidator")
          @Validator
          public class EqualValidator implements javax.faces.validator.Validator {
          ...
           public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
          ...
           }
          }
          
          
          --------------------------------------
          
          <h:inputSecret id="confirmPassword" value="#{user.confirmPassword}" required="true"
           maxlength="40" redisplay="true" tabindex="3" styleClass="input">
           <f:validator validatorId="equalValidator"/>
          </h:inputSecret>
          
          


          C) To implement custom Hibernate Validator (it will work with s:validate).
          public class MyEmailValidator implements Validator<MyEmail> {
          ...
           public boolean isValid(Object value) {...
          }
          ...
          }
          -----------------------------
          
          @Documented
          @ValidatorClass(EmailValidator.class)
          @Target({METHOD, FIELD})
          @Retention(RUNTIME)
          public @interface MyEmail {
           String message() default "{validator.email}";
          }
          
          
          
          .............
          @Entity
          public class User {
          ...
           @MyEmail
           private String email;
          ...
          }
          
          


          I used A) and B) and C) in different scenarios, but at the moment I din't use C) to access database querying for some data. Maybe you can try making MyEmail class a Seam component (which will allows you to access SMPC).

          HTH.

          • 2. Re: validation

            Thank you. I seem to like approach B.

            • 3. Re: validation
              monkeyden

              Or "D", use surrogate keys and don't let the user edit the PK.