[jsr-314-open] inter-component and form-level validation
Pete Muir
pmuir at redhat.com
Mon Aug 3 13:44:38 EDT 2009
Hi Alex,
Interesting idea :-)
On 29 Jul 2009, at 23:24, Alexander Smirnov wrote:
> 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.
Yes, this is a clear limitation BUT would work well for entities,
which IMO is the 80% case of what people are doing.
Other challenges I see include performance (especially around all that
cloning of a big object graph).
> 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.
Once Seam 3 is going, we should start to promote this a bit and get
some feedback...
I will say again that I think that whatever we do with graph
validation should be extensively developed and prototyped in the
community before considering specifying it - we have nothing much that
does this today.
>
> 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