[jboss-user] [JBoss Seam] - Hibernate and regular JSF validation and EntityHome prob

hstang do-not-reply at jboss.com
Mon Jun 18 12:47:31 EDT 2007


I have a very simple page that edits the "first name" property of a Person entity using an EntityHome object.  The page has an input text control and an update button that is only rendered if the "managed" property is true.  I want to place two constraints on editting the first name:

(1) minimum length must be at least 2 characters
(2) first name cannot equal to "jsf"

I'm using Hibernate validators to do (1) via @Length(min = 2), and I'm using regular JSF validation to do (2).  (2) is enabled by appending f:validator tag in my input text control.

Simple enough, but I'm encountering a couple strange behaviours.

If you enter "jsf" to force regular JSF validation, then the "managed" property of the EntityHome becomes false and the update button disappears, but you'll get the validation error message on the screen.  Why does the "managed" property becomes false after a regular JSF validation error?

If you enter the letter 'a' to force a hibernate validation error (because minimum length is less than 2), then I get an exception with message:
"Caused by org.hibernate.validator.InvalidStateException with message: "validation failed for: com.mxnmedia.siteaudit.model.Person".  Note at this time I still have the f:validator tag attached to the input text control.  Now, if I remove f:validator tag to disable regular JSF validation, then I'll get the expected "length must be between 2 and 2147483647" message AND the update button will still be there.

Below is the minimal code I have to reproduce this.  I was using latest Seam-CVS. Edit page is accessed by [whatever_your_context_path_is/test.seam?id=1]

## JsfValidator.java

  | @Name("jsfValidator")
  | @Validator
  | public class JsfValidator implements javax.faces.validator.Validator, Serializable {
  |   public void validate(FacesContext facesContext, UIComponent uiComponent, Object object)
  |       throws ValidatorException {    
  |     if ("jsf".equals((String) object))
  |       throw new ValidatorException(new FacesMessage("Validation failed"));
  |   }
  | }
  | 

## components.xml

  | <fwk:entity-home name="personHome" entity-class="Person"/>
  | 

## import.sql

  | INSERT INTO person(id,firstname) VALUES (1,'Joe');
  | 

## Person.java

  | @Entity
  | public class Person {
  | 
  |   @Id
  |   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
  |   @SequenceGenerator(name = "generator", sequenceName = "person_seq")
  |   private Long id;
  | 
  |   @Length(min = 2)
  |   private String firstName;
  | 
  |   // getters and setters for firstName and id
  | 

## test.page.xml

  | <page ..>
  |   <begin-conversation join="true"/>
  |   <param name="id" value="#{personHome.id}" converterId="javax.faces.Long"/>  
  | </page>
  | 

## test.xhtml

  | <h:form>
  |   <f:facet name="afterInvalidField">
  |     <s:message/>
  |   </f:facet>
  | 
  |   <s:validateAll>
  |     <s:decorate>
  |       <h:inputText value="#{personHome.instance.firstName}"
  |                    required="true">
  |         <f:validator validatorId="jsfValidator"/>
  |       </h:inputText>
  |     </s:decorate>
  |   </s:validateAll>
  | 
  |   <h:commandButton action="#{personHome.update}"
  |                    value="Update"
  |                    rendered="#{personHome.managed}"/>
  | </h:form>
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4055306#4055306

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4055306



More information about the jboss-user mailing list