[bv-dev] Constructor validation

Sebastian Thomschke sebastian.thomschke at web.de
Fri Dec 2 18:28:20 EST 2011


Constraints you add to a property are constraints that are used to 
determine an object's state (valid or invalid).
Constraints you add to parameters are preconditions and must be 
satisfied before the method body is allowed to be executed. So yes, I 
think there is a semantic difference.
Now the question is in which cases are those preconditions evaluated? 
When you manually invoke the method somewhere in your code or only when 
the method is invoked explicitly via e.g. a DI framework that itself 
utilizes BV.
As long as this is addressed in the specs I'm fine.
In OVal for example preconditions are only evaluated automatically when 
your project is setup for programming by contract correctly as 
documented here: 
http://oval.sourceforge.net/userguide.html#programming-by-contract

Other interesting aspects regarding constructor/method validation that 
should be addressed are:
- do we support parameters on static methods?
- which visibilities do we support? public, private, package, protected? 
all?
- inheritance: you pass a java.lang.Method object of class A to 
validateMethodParameters() and an object of class B extending class A 
which overrides this method. Which constraints are checked, the ones of 
the method declared on class A, the ones declared on the method of class 
B or the sum of the methods in A & B?
- When you add a method return value constraint to a parameterized 
method and you do Validator.validate(object), thoses constraints are not 
evaluated. But when you add a constraint to a getter-style method (which 
also looks and actually is a method return value constraint). They are 
evaluated by Validator.validate(object). What if someone wants to add a 
method return value constraint to a getter-style method, that is not 
evaluated when Validator.validate(object) is executed but after the 
method itself has been invoked? In OVal you have to explicitely add the 
@IsInvariant annotation to getter methods if their constraints should be 
evaluated too when Validator.validate(object) is executed. If so, OVal 
will invoke the getter and test the returned value against the 
constraints specified.

Regards,

Seb


On 02.12.2011 22:25, Gunnar Morling wrote:
> Yes, I see. I'm not really sure, what we can do about this except
> making this very clear in the spec/documentation.
>
> After all it's the same thing with "normal" constraints, such as
> property constraints. Only adding a constraint to a property doesn't
> cause it to be validated automatically.
>
> Or did you have something else in mind?
>
>
> 2011/12/1 Emmanuel Bernard<emmanuel at hibernate.org>:
>> Yes. That concerns me a bit to be honest especially when more technologies will offer BV integrations. We need to think this through before opening pandora's box even more :)
>>
>> On 1 déc. 2011, at 21:48, Sebastian Thomschke<sebastian.thomschke at web.de>  wrote:
>>
>>> Ok gotcha.Maybe we should make it clear in the specs that adding
>>> parameter constraints does not necessarily mean when such a
>>> constructor/method is invoked from somewhere in unmanaged code that an
>>> instant validation will happen, but that the time of validation and if a
>>> validation happens at all depends on the validator implementation.
>>>
>>> Regards,
>>> Seb
>>>
>>> On 01.12.2011 21:32, Gunnar Morling wrote:
>>>> Hi Sebastian,
>>>>
>>>> is this really something which we should consider in BV?
>>>>
>>>>>  From my point of view we should only provide an API for
>>>> method/constructor validation (by adding
>>>> Validator#validateMethodParameters() for instance), but we shouldn't
>>>> provide a trigger/hook executing this validation. I'd see this as the
>>>> responsibility of technologies integrating with BV (similar to the
>>>> existing validate() methods which are invoked by JSF/JPA if
>>>> applicable).
>>>>
>>>> So whether method validation is triggered via a proxy, CDI/Spring AOP
>>>> interceptor etc. should be transparent for BV IMO.
>>>>
>>>> I wasn't sure about whether there is an actual need for constructor
>>>> validation, but Emmanuel's answer about JAX-RS confirmed that need :)
>>>>
>>>> --Gunnar
>>>>
>>>>
>>>> 2011/12/1 Sebastian Thomschke<sebastian.thomschke at web.de>:
>>>>> Supporting constructor parameter validation as well as validation of
>>>>> parameters of methods not part of an interface requires some sort of
>>>>> byte code enhancements and cannot be done via JDK proxying.
>>>>> So if we find a sufficient solution how to achieve method parameter
>>>>> validation without JDK proxies I do not see why we should not support
>>>>> constructor parameter validation too.
>>>>>
>>>>> Regards,
>>>>> Seb
>>>>>
>>>>> On 30.11.2011 19:59, Gunnar Morling wrote:
>>>>>> Hi experts,
>>>>>>
>>>>>> Emmanuel asked me to take the lead on the method validation feature,
>>>>>> so be prepared for related questions, API proposals and requests for
>>>>>> feedback via the mailing list :)
>>>>>>
>>>>>> The first issue I'd like to discuss is the validation of constructor
>>>>>> arguments. Is this something which we want to support at all? I don't
>>>>>> think there are that many interception solutions which enable
>>>>>> constructor interception at all (for instance CDI interceptors don't,
>>>>>> AFAIK).
>>>>>>
>>>>>> So personally I'd be fine with focussing on actual method validation
>>>>>> in BV 1.1, waiting for user demand for constructor validation and
>>>>>> adding it possibly in a later release. WDYT?
>>>>>>
>>>>>> If we decide to include constructor validation, should we support the
>>>>>> validation of newly created objects (similar to return value
>>>>>> validation), e.g. like that:
>>>>>>
>>>>>> public class Foo {
>>>>>>
>>>>>>     @Valid
>>>>>>     public Foo() {
>>>>>>
>>>>>>     }
>>>>>>
>>>>>> }
>>>>>>
>>>>>> Here @Valid would trigger a validation of the newly instantiated Foo
>>>>>> object (whether to use @Valid or another annotation still needs to be
>>>>>> discussed). Any thoughts?
>>>>>>
>>>>>> --Gunnar
>>>>>> _______________________________________________
>>>>>> beanvalidation-dev mailing list
>>>>>> beanvalidation-dev at lists.jboss.org
>>>>>> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
>>>>> _______________________________________________
>>>>> beanvalidation-dev mailing list
>>>>> beanvalidation-dev at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
>>>> _______________________________________________
>>>> beanvalidation-dev mailing list
>>>> beanvalidation-dev at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
>>> _______________________________________________
>>> beanvalidation-dev mailing list
>>> beanvalidation-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
>> _______________________________________________
>> beanvalidation-dev mailing list
>> beanvalidation-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
> _______________________________________________
> beanvalidation-dev mailing list
> beanvalidation-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev



More information about the beanvalidation-dev mailing list