<div dir="ltr"><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jan 21, 2013 at 11:35 AM, Emmanuel Bernard <span dir="ltr">&lt;<a href="mailto:emmanuel@hibernate.org" target="_blank">emmanuel@hibernate.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On the subject, Gunnar and I were discussing three valid options to<br>
define a constraint as cross-parameter constraint:<br>
<br>
## @CrossParametersConstraint<br>
<br>
(first off I hate the name, can&#39;t we find a better one?)<br>
<br>
    @Constraint(validatedBy=ObjectScriptAssert.class)<br>
    @CrossParametersConstraint(validatedBy=ObjectScriptAssert.class)<br>
    public @interface ScriptAssert { ... }<br>
<br>
## @Constraint for both<br>
<br>
    @Constraint(validatedBy=ObjectScriptAssert.class<br>
                validatedByForCrossParameters=ObjectScriptAssert.class)<br>
    public @interface ScriptAssert { ... }<br>
<br>
## @Validates on ConstraintValidator<br>
<br>
<br>
    @Constraint(validatedBy=ObjectScriptAssert.class)<br>
    public @interface ScriptAssert { ... }<br>
<br>
    @Validates({CROSS_PARAMETERS, ANNOTATED_ELEMENTS})<br>
    public class ObjectScriptAssert implements<br>
        ConstraintValidator&lt;ScriptAssert,Object[]&gt; { ... }<br>
<br>
## Thoughts<br>
<br>
I think I like @CrossParametersConstraints more than @Constraint for<br>
both as it makes things explicit and keep the simple use case as is.<br>
<br>
But I am intrigued by the @Validates option. In many ways, it&#39;s similar<br>
to how we resolve the right constraint validator based on the type. The<br>
only difference is that the @Validates annotation refines how Object[]<br>
should be interpreted. It &quot;fits better&quot; in my opinion.<br>
<br>
My concern around the latest option is that it forces us to be a<br>
subclass of ConstraintViolation for the foreseeable future including<br>
when we reopen the type-safe options we explored in<br>
<a href="http://beanvalidation.org/proposals/BVAL-232/" target="_blank">http://beanvalidation.org/proposals/BVAL-232/</a><br>
<br>
Thoughts and comments?<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>So you&#39;re saying @Validates would eliminate the need for a separate CrossParameterConstraintValidator interface?  FWIW, it seems to me that the separate interface just feels more straightforward.<br>
<br></div><div>Matt<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">
Emmanuel<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On Tue 2013-01-15 15:14, Gunnar Morling wrote:<br>
&gt; 2013/1/15 Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org">emmanuel@hibernate.org</a>&gt;<br>
&gt;<br>
&gt; &gt; I can live with that but we must make it crystal clear that in case of<br>
&gt; &gt; ambiguity, we raise an exception. Otherwise, someone changing the method<br>
&gt; &gt; sig might have some nasty surprises.<br>
&gt; &gt;<br>
&gt;<br>
&gt; And which of the options<br>
&gt;<br>
&gt;     @CrossParameterConstraint(validatedBy=MyCrossParameterValidator.class)<br>
&gt;     @Constraint(validatedBy=MyGenericValidator.class)<br>
&gt;     public @interface MyConstraint { ... }<br>
&gt;<br>
&gt; vs.<br>
&gt;<br>
&gt;     @Constraint(<br>
&gt;         validatedBy=MyGenericValidator.class,<br>
&gt;         crossParameterValidatorType=MyCrossParameterValidator.class<br>
&gt;     )<br>
&gt;     public @interface MyConstraint { ... }<br>
&gt;<br>
&gt; would you prefer?<br>
&gt;<br>
&gt; Personally I&#39;d lean towards the latter, since there would be exactly one<br>
&gt; meta-annotation denoting an annotation as constraint annotation type, with<br>
&gt; all attributes for the required configuration.<br>
&gt;<br>
&gt; If following the 2nd approach, we should IMO add a default clause to<br>
&gt; validatedBy() (set to the empty array), allowing for<br>
&gt; the convenient definition of cross-parameter only constraints. According to<br>
&gt; [1] this change would be binary-compatible.<br>
&gt;<br>
&gt; But this is no strong preference, I could also live with the two separate<br>
&gt; annotations.<br>
&gt;<br>
&gt; --Gunnar<br>
&gt;<br>
&gt; [1]<br>
&gt; <a href="http://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_interfaces_-_API_methods" target="_blank">http://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_interfaces_-_API_methods</a><br>
<br>
</div></div><div class="HOEnZb"><div class="h5">&gt; _______________________________________________<br>
&gt; beanvalidation-dev mailing list<br>
&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">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>
beanvalidation-dev mailing list<br>
<a href="mailto:beanvalidation-dev@lists.jboss.org">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>
</div></div></blockquote></div><br></div></div>