-
1. Re: Bean validation problem
bleathem Jun 11, 2013 2:04 AM (in response to wish79)The validator will not be apllied until you submit the form. By adding the <a4j:ajax .../> you are triggering a form submission then the value is changed.
-
2. Re: Bean validation problem
wish79 Jun 11, 2013 4:20 AM (in response to bleathem)Yes, but in Richfaces showcase there is no <a4j:ajax .../> and the validation works successfully .
see the link
they dose not use <a4j:ajax .../> and it works but in my code if i remove <a4j:ajax .../> the validation dose not fire
note:
i take the demo code and i add it to my project, the validation dose not work till i add commmand buuton and press it , strange , my richfaces v4.3.2
-
3. Re: Bean validation problem
jhuska Jun 11, 2013 4:44 AM (in response to wish79)Hello Mohammad,
to achieve client side validation you have to precisely follow the examples you are referencing.
In you example, to use JSR303, you have to put the validation constraints in the bean with use of annotations over the managed properties (e.g.
@Size
(min =
3
, max =
12
)
).See the bean code which is connected with the example:
-
4. Re: Bean validation problem
wish79 Jun 11, 2013 4:48 AM (in response to jhuska)already i did that, again the problem to fire the validation i have to add a4j:ajax on every input
-
5. Re: Bean validation problem
jhuska Jun 11, 2013 5:29 AM (in response to wish79)Could you please attach complete facelet and your bean code as well ?
-
6. Re: Bean validation problem
wish79 Jun 11, 2013 5:38 AM (in response to jhuska)xhtml :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
>
<ui:composition xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:bbt="http://java.sun.com/jsf/composite/bbt">
<rich:popupPanel id="addPopupOutSourced"
domElementAttachment="form"
modal="true"
header="#{lbs.OUT_ADD_FN}"
moveable="true"
autosized="true"
>
<f:facet name="controls">
<h:outputLink value="#" onclick="#{rich:component('addPopupOutSourced')}.hide(); return false;">
X
</h:outputLink>
</f:facet>
<h:form id="addOutsourcedForm">
<rich:panel>
<h:panelGrid columns="3">
<f:validateBean validationGroups="com.wish.diwan.common.bean.validation.groups.AddValidationGroup" >
<rich:validator>
<h:panelGroup>
<h:outputLabel for="addType" value="#{lbs.OUT_TYPE}" />
<h:outputLabel for="addType" value="#{lbs.GEN_SPERATOR}" />
<h:outputLabel for="addType" value="#{lbs.GEN_REQUIRED}" styleClass="required" />
</h:panelGroup>
<rich:select id="addType"
defaultLabel="#{msg.GEN_SELECT_VALUE} #{lbs.OUT_TYPE}"
value="#{outsourcedBacking.addOutSourcedBean.type.id}"
valueChangeListener="#{outsourcedBacking.addRepTypeChangeListener}" >
<f:selectItems value="#{outsourcedBacking.populateLKPListByParentId(1)}"/>
<a4j:ajax event="change" execute="@this" />
</rich:select>
<rich:message id="addTypeMSG" for="addType" />
<h:panelGroup>
<h:outputLabel for="addNameAr" value="#{lbs.OUT_NAME_AR}" />
<h:outputLabel for="addNameAr" value="#{lbs.GEN_SPERATOR}" />
<h:outputLabel for="addType" value="#{lbs.GEN_REQUIRED}" styleClass="required" />
</h:panelGroup>
<h:inputText id="addNameAr"
valueChangeListener="#{outsourcedBacking.arNameChangeListener}"
value="#{outsourcedBacking.addOutSourcedBean.nameAr}"
maxlength="100"
size="100" >
<a4j:ajax event="change" />
</h:inputText>
<rich:message for="addNameAr" />
<h:panelGroup>
<h:outputLabel for="addNameEn" value="#{lbs.OUT_NAME_EN}" />
<h:outputLabel for="addNameEn" value="#{lbs.GEN_SPERATOR}" />
<h:outputLabel for="addType" value="#{lbs.GEN_REQUIRED}" styleClass="required" />
</h:panelGroup>
<h:inputText id="addNameEn" valueChangeListener="#{outsourcedBacking.enNameChangeListener}" value="#{outsourcedBacking.addOutSourcedBean.nameEn}" maxlength="100" size="100" >
<a4j:ajax event="change" />
</h:inputText>
<rich:message for="addNameEn" />
<h:panelGroup>
<h:outputLabel for="addPersonName" value="#{lbs.OUT_PERSON_NAME}" />
<h:outputLabel for="addPersonName" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addPersonName" value="#{outsourcedBacking.addOutSourcedBean.personName}" maxlength="200" size="100" />
<rich:message for="addPersonName" />
<h:panelGroup>
<h:outputLabel for="addPhone" value="#{lbs.OUT_PHONE}" />
<h:outputLabel for="addPhone" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addPhone" value="#{outsourcedBacking.addOutSourcedBean.phoneNumber}" maxlength="20" size="20" />
<rich:message for="addPhone" />
<h:panelGroup>
<h:outputLabel for="addFax" value="#{lbs.OUT_FAX}" />
<h:outputLabel for="addFax" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addFax" value="#{outsourcedBacking.addOutSourcedBean.faxNumber}" maxlength="20" size="20" />
<rich:message for="addFax" />
<h:panelGroup>
<h:outputLabel for="addMobile" value="#{lbs.OUT_MOBILE}" />
<h:outputLabel for="addMobile" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addMobile" value="#{outsourcedBacking.addOutSourcedBean.mobileNumber}" maxlength="20" size="20" />
<rich:message for="addMobile" />
<h:panelGroup>
<h:outputLabel for="addPobox" value="#{lbs.OUT_POBOX}" />
<h:outputLabel for="addPobox" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addPobox" value="#{outsourcedBacking.addOutSourcedBean.pobox}" maxlength="200" size="100" />
<rich:message for="addPobox" />
<h:panelGroup>
<h:outputLabel for="addEmail" value="#{lbs.OUT_EMAIL}" />
<h:outputLabel for="addEmail" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addEmail" value="#{outsourcedBacking.addOutSourcedBean.emailAddress}" maxlength="200" size="100" >
<a4j:ajax event="change" />
</h:inputText>
<rich:message id="addEmailMsg" for="addEmail" />
<h:panelGroup>
<h:outputLabel for="addNotes" value="#{lbs.OUT_NOTES}" />
<h:outputLabel for="addNotes" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<h:inputText id="addNotes" value="#{outsourcedBacking.addOutSourcedBean.note}" maxlength="200" size="100" />
<rich:message for="addNotes" />
<h:panelGroup>
<h:outputLabel for="addOrder" value="#{lbs.OUT_ORDER}" />
<h:outputLabel for="addOrder" value="#{lbs.GEN_SPERATOR}" />
</h:panelGroup>
<rich:inputNumberSpinner id="addOrder" value="#{outsourcedBacking.addOutSourcedBean.order}" maxValue="9999" minValue="0" />
<rich:message for="addOrder" />
</rich:validator>
</f:validateBean>
</h:panelGrid>
<a4j:commandButton id="addOutSourcedBTN"
render="outsourcedTable"
value="#{lbs.BTN_ADD}"
oncomplete="if(#{outsourcedBacking.closeAddDialog}){#{rich:component('addPopupOutSourced')}.hide();}"
actionListener="#{outsourcedBacking.saveAddAction()}"/>
</rich:panel>
</h:form>
</rich:popupPanel>
</ui:composition>
</html>
bean:
@Entity(name="DW_OUT_SOURCED")
@Table(name="DW_OUT_SOURCED")
@TableGenerator(name = "outsourcedGenerator", table = "DW_SEQUENCE", schema = "DIWAN", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "OUT_SOURCED_SEQUENCE", allocationSize = 1, initialValue = 0)
public class OutsourcedBean extends BaseBean{
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator="outsourcedGenerator")
@Column(name="ID")
private int Id;
@NotEmpty(message="{GEN_REQUIRED}" , groups={AddValidationGroup.class , EditValidationGroup.class,ManageValidationGroup.class})
@JoinColumn(name="TYPE_ID",referencedColumnName="ID",nullable=false)
@ManyToOne
private ChildLKPBean type;
@NotEmpty(message="{GEN_REQUIRED}" , groups={AddValidationGroup.class , EditValidationGroup.class})
@Column(name="NAME_AR",length=100, nullable = false,unique = true)
private String nameAr;
@NotEmpty(message="{GEN_REQUIRED}" , groups={AddValidationGroup.class , EditValidationGroup.class})
@Column(name="NAME_EN",length=100, nullable = false,unique = true)
private String nameEn;
@Column(name="PERSON_NAME",length=200)
private String personName;
@Column(name="PHONE_NUMBER",length=20)
private String phoneNumber;
@Column(name="FAX_NUMBER",length=20)
private String faxNumber;
@Column(name="MOBILE_NUMBER",length=20)
private String mobileNumber;
@Column(name="POBOX",length=200)
private String pobox;
@Column(name="EMAIL_ADDRESS",length=200)
@Email(message="{GEN_EMAIL_FORMAT_IS_NOT_CORRECT}",groups={AddValidationGroup.class , EditValidationGroup.class})
private String emailAddress;
@Column(name="NOTE",length=200)
private String note;
@Column(name="ORDER_ID",length=10)
private int order;
-
7. Re: Bean validation problem
jhuska Jun 12, 2013 3:26 AM (in response to wish79)You should use annotations from javax.validation.constraints package.
See
http://docs.oracle.com/javaee/6/api/javax/validation/constraints/package-summary.html
-
8. Re: Bean validation problem
lfryc Jun 12, 2013 8:30 AM (in response to jhuska)1 of 1 people found this helpfulThere might be two problems,
- as Juraj said, @NonEmpty is not part of Bean Validation 1.0 (Java EE 6)
- you are using Validation Groups feature which is not supported by rich:validator (it's supported just by rich:graphValidator)
For (2), nice catch, this is something we should really support, could you please create a feature request?
If you wouldn't use validation groups (just try to remove them [1]), then rich:validator will at least know that there is some bean validation involved (even if using custom validators/annotations).
In order to let the rich:validator work just client-side (without JavaScript fallback), you need to define Javascript implementation of validator and register it in csv.xml.
But even if you don't have Javascript impl, rich:validator should always do AJAX fallback, where server-side impl determines whether bean property pass validation.
So in your case it's just about rich:validator which doesn't know there are some validation concerns (because it doesn't support validation groups).
Anyway, Mohammad, could you please create a feature request?
[1]
@NotEmpty(message="{GEN_REQUIRED}" , groups={AddValidationGroup.class , EditValidationGroup.class})
@Column(name="NAME_AR",length=100, nullable = false,unique = true)
private String nameAr;
-