jPDL + validation
timony May 6, 2008 4:02 PMHi,
I am using the jPDL for defining the work flow and also validate the fields in the form using the ajax rerender feature. If I enter invalid data to the field (e.g. leave the form empty for required fiedl) and leave the input, the validation work fine, the message is displayed that I left the field empty (what indicates that the validation is set-up properly).
But when I send the data to the server by the nodes defined in jPDL, the data are sent allthrough some required fields are emtpy (or e.g. wrong number format is provided).
I dont want to validate explicitly by using expression in the jPDL, if there is powerful validation framework built in Seam...
Does anyone know where the problem is? Maybe I missed something really important on inserting the data by using jPDL.
Here is the code:
Starting the pageflow:
<s:button action="#{companyHome.start}" value="#{messages.label_edit}" id="editCompany">
<f:param name="companyId" value="#{companyHome.instance.id}" />
</s:button>pageflow edit company:
<?xml version="1.0"?>
<pageflow-definition xmlns="http://jboss.com/products/seam/pageflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pageflow http://jboss.com/products/seam/pageflow-1.2.xsd"
name="editCompany">
<start-state name="start">
<transition name="edit" to="edit" />
<transition name="remove" to="confirmRemove" />
</start-state>
<page name="edit" view-id="/portfolio/companyEdit.xhtml">
<redirect />
<transition name="save" to="saveCompany" />
<transition name="cancel" to="complete" />
</page>
<page name="confirmRemove" view-id="/confirm.xhtml">
<redirect/>
<transition name="yes" to="completeDelete" >
<action expression="#{companyHome.remove}" />
</transition>
<transition name="no" to="complete" />
</page>
<decision name="saveCompany"
expression="#{companyHome.managed}">
<transition name="true" to="complete">
<action expression="#{companyHome.update}" />
</transition>
<transition name="false" to="complete">
<action expression="#{companyHome.persist}" />
</transition>
</decision>
<page name="complete" view-id="/portfolio/portfolio.xhtml"
no-conversation-view-id="/portfolio/portfolio.xhtml">
<redirect />
<end-conversation />
</page>
<page name="completeDelete" view-id="/portfolio/portfolio.xhtml"
no-conversation-view-id="/portfolio/portfolio.xhtml">
<redirect />
<end-conversation />
</page>
</pageflow-definition>CompanyHome (Seam framework)
@Name("companyHome")
@Restrict("#{identity.loggedIn}")
@Scope(ScopeType.CONVERSATION)
public class CompanyHome extends EntityHome<Company>
{
private static final long serialVersionUID = 9057915693870914547L;
@RequestParameter
Integer companyId;
@RequestParameter
String action;
@In(value = "currentUser")
User currentUser;
@In(create = true)
ProductHome productHome;
@Begin(join = true, pageflow = "editCompany")
public String start()
{
setCompanyId(companyId);
if (action == null || "".equals(action))
{
return CCConstants.OUTCOME_EDIT;
}
return action;
}
public void setCompanyId(Integer companyId)
{
if (companyId != null)
{
setId(companyId);
}
}
public Integer getCompanyId()
{
return (Integer) getId();
}
@Override
protected Company createInstance()
{
Company company = new Company();
company.setUser(currentUser);
return company;
}
}The edit company xhtml:
<ui:define name="body">
<h:form id="companyEditForm">
<s:decorate template="../layout/editBox.xhtml" id="editBox">
<ui:define name="header">
<h:outputText value="#{companyHome.managed ? 'messages.label_company_edit': 'messages.label_company_create'}" />
</ui:define>
<ui:define name="buttons">
<s:button id="saveCompany" value="#{companyHome.managed ? messages.label_edit : messages.label_create}" action="save" disabled="#{companyBean.validationFailed}" />
<s:button id="cancelCompany" value="#{messages.label_cancel}"
action="cancel" />
</ui:define>
<s:decorate id="nameDecoration"
template="../layout/edit.xhtml">
<ui:define name="label">#{messages.label_name}</ui:define>
<h:inputText required="true"
value="#{companyHome.instance.name}">
<a:support event="onblur" reRender="nameDecoration" />
</h:inputText>
</s:decorate>
</s:decorate>
</h:form>
</ui:define>and the Entity bean Company:
@Entity
@Table(name = "company")
public class Company implements Serializable, Idable<Integer>
{
private static final long serialVersionUID = 8106268264760054294L;
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@NotNull
@Required
@Capitalized
private String name;
@OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Collection<Product> products = new ArrayList<Product>(0);
@ManyToOne
@NotNull
private User user;
//getters and setters...