On Jun 24, 2010, at 3:32 PM, Mark Struberg wrote:

> Hi Matt!
> 

Hi, Mark.  Thanks for your response (note, all, that this doesn't preclude 
additional responses).  :)

> Interesting thoughts, but I'm not sure if JSR-303 is the golden bullet for 
> business validations. To be honest, I personally doubt it ;)
> 
> The thing is there is still the famous old 80:20 rule out there: 80% of the 
> use cases / processes take 20% of the effort, but the very little rest which 
> is left (all the 'exceptional' cases) will cost you 80% of the whole budget 
> (money and time wise).
> 

Yes, I've become very familiar with that concept recently.  :)

> Why do I do all those prays? Because I personally think that more complex 
> business validations should still be programmed in the business code because 
> they are so complex that there is no easy way to 'configure' them. Maybe it 
> can be done by configuration, but most probably simply coding it will be 
> easier.
> 
> It's like with all meta-languages: the more powerful they become, the more 
> complex they get. And often they grow more complex than having a general 
> purpose programming language + a few small helper libraries for your special 
> problem.
> 
> Take for example a simple multi field cross - validation. This seems sooo 
> easy at the first glance, but it is _really_ hard to do it right!
> 
> assumption: it should not be possible to set wrong values into your data 
> beans. 
> 
> This sounds easy, because you just need to validate each field before you 
> actually set the value. But let's consider a bean (heavily simplified and 
> meta coded)
> public class BeanX {
>  @MustBeZero if field j > 3
>  int i;
> 
>  @MustBeZero if field i > 3
>  int j;
> }
> 
> 
> And now what happens if you like to set i=6 and j=8 ?
> As you can see, this really depends on the order in which the fields get set.
> You can easily set i=6 as long as j is not yet filled. But what happens then? 
> While trying to set j=8 the 2nd field validation fails. So this situation is 
> obviously not allowed. But in what state are we now? We already allowed to 
> set i=6 which is only half of the truth! We basically trashed our bean, 
> because ideally it should still contain the old values and even setting i=6 
> should have been revoked.
> 

I would argue that this is an example of a misconfiguration, and nobody has any 
business being upset when it fails.  ;)

> I don't think there is a way to work around this without introducing a 
> complete shadow instance of the bean. But this is only the peak of the 
> iceberg - there are sooo many other much more difficult situations out there. 
> 

To disclose further, a shadow instance of the bean is very nearly what I am 
working with:  a collection of metadata for a graph's properties (in case 
you're concerned about me at this point, I will go on to disclose that they are 
lazily and dynamically generated wherever possible).  In fact, I began this 
layer of my project with my own notion of a property constraint; I'd just like 
to migrate that to be a ConstraintDescriptor and cut down on reinventions of 
wheels where I can.

> To relativate this - I now work with JSR-303 in a EE6 project since december 
> last year (being a really early adaptor) - and in those 80% of the cases 
> JSR-303 eases my life HEAVILY. I'd say the rate is even much higher - close 
> to 98% (*). But there are still those 2% where I rather code my business 
> rules in Java than I configure an utterly complex JSR-303 ruleset.
> 
> So while having a dynamic ruleset seems cool from the first glance, I'm not 
> sure if the old-fashioned way of just coding it wouldn't be much easier?
> 

What I currently have is the ability to use Java and/or Drools to apply 
constraints to my graph.  So I am, as you recommend, implementing a business 
rule in whatever way is the best combination of [quicker|easier|more 
maintainable] to _set_up_ the constraint for querying and validation.  I 
honestly haven't heard anything to make me believe that, for my existing 
structure, the approach I outlined before is not reasonable.

> LieGrue,
> strub
> 
> (*): to make this more clear: JSR-303 really rocks, because you will get rid 
> of manually hacking most of the 'dumb' validation code which is always the 
> same over and over again...
> 

Strangely, I have very little to perform in the way of dumb/repetitive 
validations; the vast majority of what I need is context-dependent.  I simply 
can't resolve myself to the notion that ALL my validation information, of 
whatever complexity, should not ultimately be funneled through a single point.  
At this point you've not managed to dissuade me from my plan, though I repeat 
my appreciation of your willingness to discuss it.

-Matt

> 
> 
> ----- Original Message ----
>> From: Matt Benson <[email protected]>
>> To: [email protected]
>> Sent: Thu, June 24, 2010 8:47:25 PM
>> Subject: Dynamically applied constraints
>> 
>> Hello all--
>  I'm just getting my feet wet with JSR-303.  I started 
>> out using hibernate-validator, but as a foundation member and general 
>> connoisseur of Apache Kool-Aid I thought the very least I could do is give 
>> bval 
>> a fair shake.  So far, just browsing code and javadocs--my typical way of 
>> acquainting myself with an OSS project--I'm impressed, FWIW.
> 
> What I want 
>> to do is expose all my validation information to my controller/view layers 
>> per 
>> the standard APIs, and here's the catch:  *including* business-level 
>> validations which can be extremely dynamic in nature.  To be more explicit, 
>> I am in the insurance industry, which (in the US anyway) consists pretty 
>> much 
>> entirely of "special cases."
> 
> Firstly, is this considered out of scope of 
>> "Bean Validation" (the spec)?  bval?  If so, why?--It's my feeling 
>> that the spec intends that "validation" be quite an open-ended concept.  A 
>> blanket "don't do this" would simply make me question the overall usefulness 
>> of 
>> the spec.  However, it's obvious (at least, I *think* it is) that neither 
>> the annotation-based nor XML-based configuration methods can handle the 
>> dynamic 
>> application of constraints to a model.  At the same time I want to be able 
>> to use those configuration methods for the subset of validations that *can* 
>> be 
>> handled so globally.
> 
> I am thinking that I can reuse some of the 
>> underlying APIs from one of the existing Bean Validation implementations to 
>> maintain this dynamic information, then implement the ConstraintValidator 
>> for an 
>> e.g.  @DynamicValidation annotation to reuse others' machinery.  
>> *This* I could configure in XML; best of both worlds.  So to put this into 
>> bval terms, I could maintain a MetaBean graph for each distinct model graph 
>> and 
>> dynamically apply constraints per graph.
> 
> This email has written itself in 
>> the sense that writing down my thoughts led to numerous edits and sculpted 
>> the 
>> above-outlined approach, which I'm tentatively feeling pretty good about, 
>> but 
>> I'd still like to get preliminary feedback from the community on the oh-shit 
>> level of the task I'm setting myself.
> 
> Regards,
> Matt
> 
> 
> 
> 

Reply via email to