[jsr-314-open] inter-component and form-level validation
Pete Muir
pmuir at redhat.com
Sat Jul 25 19:05:17 EDT 2009
Dan, I think that would be sensible - this discussion is hard to read
and a bit confusing in places.
I think this is an important topic going forward, and this looks like
it could form the starting point for a discussion.
On 15 Jul 2009, at 00:56, Dan Allen wrote:
> >From the jsr-314-comments mailbox comes this discussion between
> myself and Mathias Werliz about inter-component validation.
> Unfortunately the discussion progressed outside of the mailinglist,
> so the post below is the aggregate of the individual messages. If
> there is confusion we can summarize the discussion up to this point
> and continue the discussion on each individual point.
>
> ---------- Forwarded message ----------
> From: Dan Allen <dan.j.allen at gmail.com>
> Date: Thu, Jul 9, 2009 at 2:09 PM
> Subject: Re: inter-component and form-level validation
> To: "Werlitz, Mathias" <werlitz at adesso.de>
> Cc: jsr-314-comments at jcp.org
>
>
> On Thu, Jul 9, 2009 at 11:36 AM, Werlitz, Mathias
> <werlitz at adesso.de> wrote:
> Sorry for the late response. I’m very busy on a customer project at
> the moment, analysing JSF 1.2 (view state) and Facelets memory
> consumption on IBM Portal 6.1.
>
> I agree that there are two basic approaches to solve multiple-
> field / form-validation:
>
> 1. model based validation after the update model phase and
> 2. validating the converted values of multiple components
>
> In both cases there should be an easy way to assign the proper
> validation message to the originating input component or group of
> input components. With complex forms including inputs within naming
> containers like <h:dataTable> this may become quite complicated.
> Flattening the properties of the object graph for JSR-303 model
> validation does not seem to be a good idea in this case.
>
> I realize that JSR-303 isn't going cover every case. I must admit to
> still being the fence on how to best handle the situation you are
> citing...meaning can I do it comfortably with JSR-303 or not? I
> think a solid use case would help us test the limits.
>
>
> Well I simplified a test case – I’m unsure that this is easily done
> with JSR-303. Image a form with a master date and several additional
> dates. The number of the additional dates is dynamic – will be
> configured by the user (added and removed) or determined by the
> server.
>
> For simplicity there is only one multi-field validation rule: all
> additional dates must be after the master date. The view would look
> something like this (note: the list of additional dates is a list of
> a custom bean that stores the date and maybe additional data for
> every entry):
>
>
> <h:input id=”masterDate” value=”mybean.masterDate” />
>
> <h:datatable value=”mybean.myAdditionalDates” var=”item” >
>
> <h:input id=”addtionalDate” value=”item.additionalDate” />
>
> </h:datatable>
>
> This could be done with JSR-303. You can have a validation
> annotation on the array (or List) property holding the "after" dates
> and say that they must come after the master date property. But
> again, the limitation is that it has to happen after update model
> values.
>
> Earlier when I said you have to flatted your model, I didn't mean
> you couldn't use collections. You just can't easily validate a
> property on one class against a property on another.
>
> But pointing that aside, you could still accomplish w/ a regular JSF
> validator if all conversions happened before the validation phase.
> Then you just do something like:
>
> <h:input id="additionalDate" value="#{item.additionalDate}">
> <x:validateAfter id="masterDate"/>
> </h:input>
>
>
>
>
> One downside of the model based validation is that the whole
> validation process is split up into two phases. That means the user
> may get the error messages in two bunches: first the errors of the
> validation phase and later the model errors. This can be quite
> confusing.
>
> The reality is, there are two validation phases in input-based
> applications. You simply cannot test some business validations if
> you don't have correct data to start with. I think the real point is
> to make sure that all input validation is handled together...and
> that business validation is really business validation. Having one
> date before another I agree is likely an input validation, not a
> business validation.
>
>
> Yes, that’s the point. At the moment JSF does make it very hard to
> do the input validation altogether.
>
> There will likely always be two steps. The question is, can we get
> those two steps right?
>
>
>
> To emphasize why there must be two validation phases, consider this
> case. You walk into an ice cream store and the employee asks you
> which flavor of ice cream you want. You say you want pizza. They
> say, "Sir, we don't have pizza, you have to pick and ice cream."
> Then you say that you want Heath ice cream. The employee says,
> sorry, we don't have that in stock. So the first is an input
> validation, the second is business. The employee couldn't have told
> you they don't have Heath ice cream in stock because the employee
> doesn't know what you want. It's not really that confusing.
>
>
> I agree with you, but in fact there are three steps where messages
> could be associated with an input field (convert, validation,
> business rules) and every step depends on the previous one.
>
>
> Well, one common requirement of our customers is: Display error
> messages as early as possible. Separating the validation into two
> phases makes this hard. Using good old Struts this example is no
> problem at all.
>
> That's because Struts effectively updated the model and then
> validated, moving all validation to the later phase. In JSF there is
> an understanding that values won't get assigned to the model unless
> they are valid syntax or type. You could throw that out the window
> and do all your validations after the update model values phase and
> get the same result. So we are questioning the fundamental guarantee
> of JSF (which, by the way, may need to be questioned).
>
>
> Well I think you got me wrong. The point is that in Struts you are
> able to store all the form data (as strings) in a form bean. You are
> responsible to make your own conversation. But because of that you
> are able to validate all input data including multi-field
> validation. On success you proceed to assign the values on your own
> to the real model.
>
>
> That’s not perfect. The only problem with JSF is that you don’t have
> this intermediate view on the form data where all converted values
> of the form is available altogether before deciding to move on to
> the update model phase.
>
> I think we are saying the same thing. JSF applies the values
> directly to the model by attempting to convert each value. Now, you
> could copy all properties to a model with string properties and
> essentially coerce JSF into skipping validation so that you can
> handle it yourself, but that really defeats a large goal of JSF.
>
>
> I like your idea of dividing converting and validation. I think
> JSR-303 model based validation is not sufficient. In the discussion
> with my college we had a similar idea as a workaround for JSF 1.2:
> We thought about a special custom validator added to all relevant
> input components that collects all converted input data from the
> components and the corresponding client ids/component instances.
> This also works fine with <h:dataTable>. The data could be collected
> with a Map or special validation-model bean. At the end of the
> validation phase another special form/multi-field validator
> (possible phase listener) is called with the collected data and
> invokes the validation logic. This way you get all converted data,
> components/client ids, the real model data is not touched at all and
> the whole validation is processed in one phase.
>
> It seems blatantly obvious to me that all conversion should happen
> before any validation occurs. I think the current situation is
> ridiculous and it's the root of why multi-field validation is so
> screwed up to begin with.
>
>
> See my previous comment… The question is: when this will change. JSF
> 2.0 would be the right version. But I guess it’s already too late
> for such a fundamental change in the lifecycle – separating
> conversation and validation.
>
> It won't be JSF 2.0. Hopefully JSF 2.1 or sooner.
>
> -Dan
>
> --
> Dan Allen
> Senior Software Engineer, Red Hat | Author of Seam in Action
>
> http://mojavelinux.com
> http://mojavelinux.com/seaminaction
> http://in.relation.to/Bloggers/Dan
>
> NOTE: While I make a strong effort to keep up with my email on a daily
> basis, personal or other work matters can sometimes keep me away
> from my email. If you contact me, but don't hear back for more than
> a week,
> it is very likely that I am excessively backlogged or the message was
> caught in the spam filters. Please don't hesitate to resend a
> message if
> you feel that it did not reach my attention.
>
>
>
> --
> Dan Allen
> Senior Software Engineer, Red Hat | Author of Seam in Action
> Registered Linux User #231597
>
> http://mojavelinux.com
> http://mojavelinux.com/seaminaction
> http://in.relation.to/Bloggers/Dan
More information about the jsr-314-open-mirror
mailing list