Form validation does not work with Seam and Hibernate
derkd Jul 28, 2009 11:28 AMHi all,
I have a web application which collects data from a webservice. I have a field which needs a minimum of 3 characters before it can make a call to the webservice.
So I thought why not make a validation for this in the form and make use of the Hibernate Annotations. Is this even possible when you do not use a database at all and only use it for form validation?
I use Seam 1.2.1GA with RichFaces and Hibernate Validator 3.0.0.GA.
I have this action:
@Name("zoekOpleidingAction") @Scope(ScopeType.CONVERSATION) public class ZoekOpleidingAction implements Serializable { private String zoekLettercombinatie; @DataModel(scope = ScopeType.PAGE) protected List<IOpleiding> lettercombinatieOpleidingen; @NotNull @Length(min=3, message="min 3") public String getZoekLettercombinatie() { return zoekLettercombinatie; } public void setZoekLettercombinatie(String zoekLettercombinatie) { this.zoekLettercombinatie = zoekLettercombinatie; } @Size(min=1, max=10, message="#{['maxOpleidingenList.length']}") public List<IOpleiding> getLettercombinatieOpleidingen() { return lettercombinatieOpleidingen; }
my page looks like this:
<!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/layout.xhtml"> <h:form> <h:panelGrid columns="1" width="100%"> <s:validateAll> <s:decorate name="opleidingZoekOpleidingComb" layout="../layout/validate.xhtml"> <ui:define name="label">Zoekterm:</ui:define> <h:inputText id="zoekOpleidingComb" value="#{zoekOpleidingAction.zoekLettercombinatie}" onkeypress="return submitEnter(this, event, 'zoekLettercombButton')" style=" width : 350px;" required="true"/> </s:decorate> <a4j:commandButton id="zoekLettercombButton" value="Zoek" action="#{zoekOpleidingAction.findOpleidingLetterCombinatie}" type="submit" reRender="lettercombOpleiding, closedFacet, openFacet" eventsQueue="opleidingLetterQueue" ignoreDupResponses="true"/> <rich:dataList id="lettercombOpleiding" var="_opleiding" value="#{lettercombinatieOpleidingen}"> <a4j:commandLink id="opleidingComb" action="#{zoekOpleidingAction.retrieveOpleidingRelatieEnd(_opleiding, true)}" oncomplete="registreer('#{zoekOpleidingAction.opleidingRelaties.cdOpleidingsnaam}+#{zoekOpleidingAction.opleidingRelaties.omsOpleidingsnaam}+#{zoekOpleidingAction.opleidingDetail.opleidingNiveauBemiddeling.cdOpleidingNiveauBemiddeling}+#{_opleiding.cdOpleidingsnaam}+#{_opleiding.omsOpleidingsnaam}')">#{_opleiding.omsOpleidingsnaam}</a4j:commandLink> <h:outputText id="whiteSpace" value=" " /> <a4j:commandLink id="opleidingInfoLink" action="#{zoekOpleidingAction.retrieveOpleidingRelatie(_opleiding)}" oncomplete="Richfaces.showModalPanel('informationOpleidingPanel');" reRender="selectedOpleiding" eventsQueue="opleidingLetterQueue" ignoreDupResponses="true"> <h:graphicImage id="informationComb" style="border-width:0" value="../images/I.png" /> </a4j:commandLink> </rich:dataList> </s:validateAll> </h:panelGrid> </h:form>
the template I use for the page is:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <f:subview contentType="text/html" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:a4j="http://richfaces.org/a4j" xmlns:s="http://jboss.com/products/seam/taglib"> <div class="body"> <a4j:region> <script language="javascript"> A4J.AJAX.onError = function(req,status,message){ alert("Er is een error opgetreden " + message); return "../error.seam"; }; A4J.AJAX.onExpired = function(loc, expiredMsg){ //alert('Uw sessie is verlopen (Layout)! U wordt teruggeleid naar deze pagina: '+loc); //return loc; //window.location = "../timeout.seam"; return "../timeout.seam"; }; </script> </a4j:region> <ui:insert name="body"/> </div> </f:subview>
the template I use to decorate the input field is this:
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:s="http://jboss.com/products/seam/taglib"> <div class="prop"> <s:label styleClass="name #{invalid?'errors':''}"> <ui:insert name="label"/> <s:span styleClass="required" rendered="#{required}">*</s:span> </s:label> <span class="value #{invalid?'errors':''}"> <s:validateAll> <ui:insert/> </s:validateAll> </span> <span class="error"> <h:graphicImage value="../images/error.gif" rendered="#{invalid}" styleClass="errors"/> <s:message styleClass="errors"/> </span> </div> </ui:composition>
so when I fill in just 2 characters I should expect a message but I don't see a message at all. Can someone help me with this?