[jsr-314-open] inter-component and form-level validation

Alexander Smirnov asmirnov at exadel.com
Wed Jul 29 18:24:08 EDT 2009


After a while, I got my early idea into a working prototype. The idea is 
coming from ValueObject pattern. In spate of that approach seems 
obsoleted for an application design, framework could implement that 
transparently to developer ( with some limitations, of course ).
The scenario for for safe object validation is:
1) Object validator creates clone of model at the 'PROCESS_DECODES' 
phase. Custom resolver substitutes that cloned object for all 
references. Prototype implementation limits that substitution to 
components inside 'graphValidator' tag. That substitution is also active 
during 'process validators' phase.
2) per-components validators detect previvious case and should update 
cloned object with converted values passed to their 'validate' method.
3) at the and of 'processValidators' method 'graphValidator' component 
performs validation procedure on the cloned object. In the case of error 
validator should send error messages to the FacesContext and tell JSF to 
go to render response phase, as usual for any other validation errors. 
Cloned object will be discarded in any case, hence subsequent phases 
work with real model.

In that scenario validation procedure can be performed on whole objects 
tree without affecting a real model.

Open questions and limitations:
1) Clone procedure. In the prototype implementation, model beans should 
implements 'Cloneable' interface and application developer have to write 
'clone()' method that properly clones all bean attributes, disconnect 
them from EntityManager ( or clean them from other frameworks, if 
necessary ). To omit that procedure from developers, validation 
framework ( or JSF library itself ? ) could perform that procedure. 
Anyway, that would work for plain JavaBeans only, where setter/getter 
methods do not perform actions that could affect other parts of application.
2) Detect cloned object in validators. It is simple in the case of 
direct references, but indirect referenced objects ( 'var' variables 
created by the dataTable, for example ) has no glue to distinguish 
original and cloned objects. Frameworks like Hibernate, Seam and JSR-299 
wraps object by proxy, therefore they could properly clone beans with 
some marker interface.

The small example is deployed onto our demo site 
http://localhost:8080/beanValidatorSample/pages/graphValidation.jsf . 
That simple example validates model that has per-property restrictions 
and limits total sum of property values.

On 07/28/2009 11:16 AM, Dan Allen wrote:
> Okay, so to restate and reignite this discussion, let me seed the topic.
>
> Several members of the EG and many other community members have voiced
> their concern that the validation mechanism in JSF is insufficient,
> particularly in regard to inter-component validation, and needs to be
> rethought/redesigned in a future release. I am deciphering two concerns.
>
> 1) Validation is happening in two places, once before model update and
> once after, which confuses the user (they have to submit the form twice
> to get all the validation errors)
> 2) Inter-component validation is very complex and in some cases, not
> possible without a lot of code stealing from the implementation
>
> There are two root causes that have been identified:
>
> 1) The assumption that validation should happen before model update,
> thus making it possible to only partially use Bean Validator (and the like)
> 2) The coupling of conversion and validation in the life cycle (each
> component is converted then validated in turn)
>
> The second root cause is easier to solve than the first. Norbert and I
> (perhaps others as well) believe everything would get a whole lot
> simpler to start with if conversion was completed before validation
> began so that when inter-component validation is attempted, all values
> are in their converted state.
>
> The first root cause is much more challenging because if a value cannot
> be converted, and you continue into validation, you run the risk of
> undefined behavior. I suppose you could say that a value which could not
> be converted results in a null value being assigned with a FacesMessage
> registered. But are two attempts to submit the form that result in
> different validation messages really a bad thing. If you enter a bogus
> number in a number field, the form will yell at you that it cannot
> proceed without a number. When you enter a number, it may then turn out
> to be out of range, and that to me is a logical progression.
>
> So the floor is open to discuss a general model for handling validation.
> Please cite use cases and case studies if necessary. We simply cannot
> let another JSF revision go by without there being a general agreement
> that validation is sufficient for the development of web applications.
>
> -Dan
>
> --
> 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