<p>Right, XML mappings can indeed be helpful here.</p>
<p>I&#39;ve written a post on <a href="http://beanvalidation.org">beanvalidation.org</a> [1] asking for feedback from a broader audience. Maybe we gain some more insight through this.</p>
<p>--Gunnar</p>
<p>[1] <a href="http://beanvalidation.org/news/2012/08/29/methodvalidation-inheritance/">http://beanvalidation.org/news/2012/08/29/methodvalidation-inheritance/</a></p>
<div class="gmail_quote">Am 29.08.2012 16:42 schrieb &quot;Hardy Ferentschik&quot; &lt;<a href="mailto:hardy@hibernate.org" target="_blank">hardy@hibernate.org</a>&gt;:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi,<br>
<br>
I voted for the true PbC approach. As I mentioned before I was undecided and can see the<br>
Paul&#39;s and Matt&#39;s point.<br>
<br>
There are two reasons I voted for PbC now. First I think this the most typical use case where<br>
BV method validation will be used and, as Gunnar pointed out, the majority of existing PbC solutions<br>
took the no strengthening of preconditions road. The alternative is to allow weakening of preconditions<br>
(via ORing the constrains), but this is something we have not even discussed further and would not<br>
solve Paul&#39;s use case.<br>
<br>
Which leads me to the second reason I voted for PbC. Emmanuel reminded me of a very important<br>
BV feature, the XML configuration. Using it you can specify the constraints easily on the OrderService<br>
directly (to use our example again). So for me this covers even this use case without even using a<br>
option/flag.<br>
<br>
--Hardy<br>
<br>
<br>
On 27 Jan 2012, at 4:12 PM, Emmanuel Bernard wrote:<br>
<br>
&gt; Just to get a better understanding of the dynamic here.<br>
&gt; Can you all vote on what you think is the best approach for Bean Validation 1.1<br>
&gt; <a href="http://www.doodle.com/qp78u6mqzetuas7p" target="_blank">http://www.doodle.com/qp78u6mqzetuas7p</a><br>
&gt;<br>
&gt; On 26 août 2012, at 09:42, Paul Benedict wrote:<br>
&gt;<br>
&gt;&gt; I was reading the Hibernate Validator documentation today. Here was<br>
&gt;&gt; something that speaks to Gunnar&#39;s intentions:<br>
&gt;&gt;<br>
&gt;&gt; &quot;When validating an object that implements an interface or extends<br>
&gt;&gt; another class, all constraint annotations on the implemented interface<br>
&gt;&gt; and parent class apply in the same manner as the constraints specified<br>
&gt;&gt; on the validated object itself.&quot;<br>
&gt;&gt;<br>
&gt;&gt; I buy into this 99% except when the parent class has no annotated<br>
&gt;&gt; constraints. Why not just make an exception for this case? I think<br>
&gt;&gt; that is so incredibly more reasonable than adding a custom<br>
&gt;&gt; implementation flag. Since constraints are meant to be compounded, a<br>
&gt;&gt; child should be able to add new constraints even if the parent never<br>
&gt;&gt; did.<br>
&gt;&gt;<br>
&gt;&gt; Paul<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Aug 22, 2012 at 3:26 PM, Gunnar Morling &lt;<a href="mailto:gunnar@hibernate.org" target="_blank">gunnar@hibernate.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt; Gunnar, do you want to take the lead on 1. and 2.?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Sure, I can do that. I&#39;ll prepare a blog post.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Personally, I&#39;m still reserved about adding such a feature. Maybe I<br>
&gt;&gt;&gt; would change my mind if someone pointed out to an existing PbC<br>
&gt;&gt;&gt; solution which provides such sort of feature/switch. What I&#39;ve seen so<br>
&gt;&gt;&gt; far is either prohibiting parameter constraints in sub-types (as we<br>
&gt;&gt;&gt; currently do) or OR-ing all parameter constraint contracts in the<br>
&gt;&gt;&gt; hierarchy (effectively applying the weakest one).<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; An implementation-specific configuration switch might be a good<br>
&gt;&gt;&gt; compromise. The spec still may define the current behavior as default<br>
&gt;&gt;&gt; and mention that implementations may add means of configuring this.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; --Gunnar<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 2012/8/22 Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org" target="_blank">emmanuel@hibernate.org</a>&gt;:<br>
&gt;&gt;&gt;&gt; Reopening the debate here.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Matt, java.util.Deque.push actually does describe the risk of NPE depending on the implementation.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Let&#39;s take the OrderService that has been designed pre-BV 1.1 and that expressed constraints per JavaDoc. There are two options today to make it work:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; - update it to add Bean Validation 1.1 annotations in compliance with the JavaDoc<br>
&gt;&gt;&gt;&gt; - use BV&#39;s XML capability to add constraints on the interface without having to touch it<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Note that adding constraints not described on the interface javadoc would be a change of contract.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; But I do hear Paul&#39;s concern as well. With all the interfaces around, do we want to force people to host their constraints on them instead of on the implementation?<br>
&gt;&gt;&gt;&gt; How much of this is a usability constraint? On the other hand, today we enforce good practice. If we open up the Pandora box, there is no way to close it.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I&#39;d go and do a few things:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 1. open up a JIRA with a summary of the problem<br>
&gt;&gt;&gt;&gt; 2. blog about it on <a href="http://beanvalidation.org" target="_blank">beanvalidation.org</a> and push people for feedback<br>
&gt;&gt;&gt;&gt; 3. get people to try a preview and give us feedback<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Gunnar, do you want to take the lead on 1. and 2.?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; If we are still on the fence, I&#39;m tempted to let implementations provide an implementation specific configuration switch.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Sebastian, OVal has had such features for a while AFAIK, what is your take on the subject?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Emmanuel<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On 23 juil. 2012, at 20:38, Paul Benedict wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I concur with Matt&#39;s point below. Because there hasn&#39;t been a<br>
&gt;&gt;&gt;&gt;&gt; validation standard for most of Java&#39;s lifetime, most method<br>
&gt;&gt;&gt;&gt;&gt; constraints are in javadoc contracts only. I think it&#39;s important for<br>
&gt;&gt;&gt;&gt;&gt; the BV spec to recognize this fact -- not every precondition is<br>
&gt;&gt;&gt;&gt;&gt; available for introspection at runtime. Thus, there is a long pedigree<br>
&gt;&gt;&gt;&gt;&gt; here of people who could benefit from BV, if only by chucking their<br>
&gt;&gt;&gt;&gt;&gt; custom validation code for BV.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; The OrderService is a great example due to the total absence of BV<br>
&gt;&gt;&gt;&gt;&gt; annotations. I don&#39;t think the spec should assume the lack of BV<br>
&gt;&gt;&gt;&gt;&gt; annotations is an intentional use of BV (i.e., no constraints). I can<br>
&gt;&gt;&gt;&gt;&gt; only see two ways out of this problem to address this fact. Either<br>
&gt;&gt;&gt;&gt;&gt; annotate OrderService to signify its validation is undefined or<br>
&gt;&gt;&gt;&gt;&gt; annotate OrderService to signify validation is intended. Thoughts?<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Paul<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On Mon, Jul 23, 2012 at 9:16 AM, Matt Benson &lt;<a href="mailto:mbenson@apache.org" target="_blank">mbenson@apache.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;&gt; Okay, point taken.  Thanks for clarifying the distinction between<br>
&gt;&gt;&gt;&gt;&gt;&gt; pre/post-conditions corresponding to method parameters vs. return<br>
&gt;&gt;&gt;&gt;&gt;&gt; values here.  Still, consider the JDK itself:  the java.util.Deque<br>
&gt;&gt;&gt;&gt;&gt;&gt; interface imposes no requirements on the parameter to its #push()<br>
&gt;&gt;&gt;&gt;&gt;&gt; method, yet the java.util.ArrayDeque implementation forbids null<br>
&gt;&gt;&gt;&gt;&gt;&gt; elements and is declared as throwing an NPE if the parameter to<br>
&gt;&gt;&gt;&gt;&gt;&gt; #push() is null.  I can fully understand your assertion that this<br>
&gt;&gt;&gt;&gt;&gt;&gt; violates DbC and even basic OO principles, but is it *necessary* that<br>
&gt;&gt;&gt;&gt;&gt;&gt; BV deny users the option to work with such a design?  I&#39;m not yet<br>
&gt;&gt;&gt;&gt;&gt;&gt; convinced of the harm it would cause, beyond implementation complexity<br>
&gt;&gt;&gt;&gt;&gt;&gt; (which IMO doesn&#39;t seem extensive), to permit a user to add decoupled<br>
&gt;&gt;&gt;&gt;&gt;&gt; validation constraints per Paul&#39;s example, or to customize a given<br>
&gt;&gt;&gt;&gt;&gt;&gt; implementation as in mine.  Nothing here would prevent the purist user<br>
&gt;&gt;&gt;&gt;&gt;&gt; from operating per your recommendations.<br>
&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt;&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; beanvalidation-dev mailing list<br>
&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
<br>
<br>
_______________________________________________<br>
beanvalidation-dev mailing list<br>
<a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
</blockquote></div>