faces messages in entity class causes validation failure???
wiggy Mar 23, 2008 1:10 AMOkay spent some more time trying to figure what was wrong in my code and observed that putting a faces messages togteher in an entity object caused my code to fail validation on a facelets form. Remove the faces message and it works fine
not sure if this is a bug but it doesnt feel right.
first off i have a form (its used as an embedded <a4j:include in a <rich:tapPanel in my home.xhtml.
here is the ui element included within a form in the home page. This is called as part of a wizard - i include a listing page which triggers this person.xhtml
page on a new
return from a button on the listing page
note the <s:decorate tags.
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" template="layout/template.xhtml"> <ui:define name="body"> <a4j:outputPanel ajaxRendered="true"> <h:messages globalOnly="true" styleClass="message"/> <rich:panel id="personDetail"> <f:facet name="header">person</f:facet> <s:decorate id="firstNameDecoration" template="layout/edit.xhtml"> <ui:define name="label">First Name</ui:define> <h:inputText id="firstName" required="true" value="#{person.firstName}"/> </s:decorate> <s:decorate id="lastNameDecoration" template="layout/edit.xhtml"> <ui:define name="label">Last Name</ui:define> <h:inputText id="lastName" required="true" value="#{person.lastName}"/> </s:decorate> <s:decorate id="middleNameDecoration" template="layout/edit.xhtml"> <ui:define name="label">Middle Name</ui:define> <h:inputText id="middleName" value="#{person.middleName}"/> </s:decorate> <s:decorate id="nicknameDecoration" template="layout/edit.xhtml"> <ui:define name="label">Nickname</ui:define> <h:inputText id="nickname" value="#{person.nickName}"/> </s:decorate> <s:decorate id="sexDecoration" template="layout/edit.xhtml"> <ui:define name="label">Sex</ui:define> <h:selectOneMenu value="#{person.sex}" id="personSex" > <f:selectItem itemLabel="unspecified" itemValue="unspecified"/> <f:selectItem itemLabel="female" itemValue="female"/> <f:selectItem itemLabel="male" itemValue="male"/> </h:selectOneMenu> </s:decorate> <s:decorate id="dateOfBirthDecoration" template="layout/edit.xhtml"> <ui:define name="label">Date Of Birth</ui:define> <h:inputText id="dateOfBirth" value="#{person.dateOfBirth}"> <s:convertDateTime type="date" dateStyle="medium" pattern="dd/mm/yyyy" /> </h:inputText> </s:decorate> <s:decorate id="dateOfMarriageDecoration" template="layout/edit.xhtml"> <ui:define name="label">Date Of Birth</ui:define> <h:inputText id="dateOfMarriage" value="#{person.dateOfMarriage }"> <s:convertDateTime type="date" dateStyle="medium" pattern="dd/mm/yyyy"/> </h:inputText> </s:decorate> <s:decorate id="dateOfDeathDecoration" template="layout/edit.xhtml"> <ui:define name="label">Date Of Death</ui:define> <h:inputText id="dateOfDeath" value="#{person.dateOfDeath}"> <s:convertDateTime type="date" dateStyle="short" pattern="dd/mm/yyyy"/> </h:inputText> </s:decorate> <s:decorate id="descriptionDecoration" template="layout/edit.xhtml"> <ui:define name="label">Description</ui:define> <h:inputText id="description" value="#{person.description}"> </h:inputText> </s:decorate> <div style="clear:both"/> </rich:panel> <div class="actionButtons"> <a4j:commandButton id="save" value="Save" action="#{personHome.persist}" rendered="#{!personHome.managed}"> </a4j:commandButton> <a4j:commandButton id="update" value="Update" action="#{personHome.update}" rendered="#{personHome.managed}"> </a4j:commandButton> <a4j:commandButton id="delete" value="Delete" action="#{personHome.remove}" rendered="#{personHome.managed}"> </a4j:commandButton> <a4j:commandButton view="/personList.xhtml" action="#{personHome.clear}" id="done" value="Done"> </a4j:commandButton> </div> </a4j:outputPanel> </ui:define> </ui:composition>
lets take the first one - if we look at the backing entity (i have an @Factory method on the EntityHome class that returns the entity bean)
@Entity ... @Transient @In FacesMessages facesMessages; ... public String getFirstName() { return (firstName == null) ? "<null>" : firstName; } public void setFirstName(String firstName) { //facesMessages.add("called person set first name #0", (firstName != null) ? firstName : "<null>"); this.firstName = (firstName != null) ? firstName : "<null>"; if (getName().contains("generic node:")) setName (firstName); else if (!getName().contains (firstName)) setName (firstName + " " + getLastName()); }
if i remove the comments on the faces messages then the web UI just errors when i submit the .persist method on the EntityHome object.
if i comment out the facesMessages as shown the code works fine. Leave it in and it errors with a validation failure in the .xhtml form saying it cant call the person.firstName method
can someone explain this??
there is a note in the seam documentation that the logger reference must be static for an entity object. is this true for facesMessages reference ?? If so why?