<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 13, 2017 at 10:55 AM, Gunnar Morling <span dir="ltr">&lt;<a href="mailto:gunnar@hibernate.org" target="_blank">gunnar@hibernate.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Right, Emmanuel&#39;s example isn&#39;t legal:<br>
<br>
    &quot;It is a compile-time error if, in a declaration context or type<br>
context, there are multiple annotations of a repeatable annotation<br>
type T and any annotations of the containing annotation type of T.&quot;<br>
<br>
But it&#39;s also says that given a single instance of the repeatable<br>
annotation type and the container annotation is valid:<br>
<br>
    @Min<br>
    @Min.List({@Min})<br>
    BooYahh foo;<br>
<br>
I&#39;m not sure how the ordering is defined - and if so, how. If we could<br>
confirm that this case can be resolved deterministically, too, then it<br>
should be doable.<br></blockquote><div><br></div><div>Oh, right. :) Yeah, it would probably be natural to assume that the resulting Min.List would contain all Min annotations in the order in which they were encountered, but any assumption could also be dangerous. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class="gmail-"><br>
&gt; A meta-annotation might look cleaner, but it might become painful to define a lot of these.<br>
<br>
</span>What exactly do you mean here? Can you give an example?<br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br></div></div></blockquote><div><br></div><div>I&#39;m thinking of an extension to the composed constraint feature. So:</div><div><br></div><div>@Size(min=3)</div><div>@ConstraintsApplyTo(WRAPPED_VALUE)</div><div>@Constraint</div><div>public @interface Nickname {</div><div>  String message() default &quot;&quot;;</div><div>  Class&lt;?&gt; groups() default {};</div><div>  Class&lt;? extends Payload&gt;[] payload() default {};</div><div>}</div><div><br></div><div><span style="font-size:12.8px">@Size(min=1) @Nickname </span><span style="font-size:12.8px">List&lt;String&gt; nicknames;</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">The example is necessarily contrived where we&#39;re talking about a &quot;normal&quot; typed extraction container, but should be applicable to:</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">@Size(min=1) @Nickname StringList nicknames;</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">As I warned, however, defining these might become tedious. It might be helpful to define a mechanism (like that supported by Spring) to map annotation elements:</span></div><div><span style="font-size:12.8px"><br></span></div><div><div>@Size</div><div>@ConstraintsApplyTo(WRAPPED_VALUE)</div><div>@Constraint</div><div>public @interface WrappedSize {</div><div><br></div><div>  @MapTo(type=Size.class, attribute=&quot;min&quot;)</div><div>  int min() default 0;</div><div><br></div><div>  @MapTo(type=Size.class, attribute=&quot;max&quot;)</div><div>  int max() default Integer.MAX_VALUE;</div><div><br></div><div><div>  String message() default &quot;&quot;;</div><div>  Class&lt;?&gt; groups() default {};</div><div>  Class&lt;? extends Payload&gt;[] payload() default {};</div></div><div>}</div></div><div><br></div><div><div><span style="font-size:12.8px">@Size(1) @WrappedSize(min=3) StringList nicknames;</span></div></div><div><br></div><div><span style="font-size:12.8px">Matt</span></div><div><span style="font-size:12.8px"><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-HOEnZb"><div class="gmail-h5">
<br>
2017-01-13 17:39 GMT+01:00 Matt Benson &lt;<a href="mailto:mbenson@apache.org">mbenson@apache.org</a>&gt;:<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Jan 13, 2017 at 10:23 AM, Matt Benson &lt;<a href="mailto:mbenson@apache.org">mbenson@apache.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Fri, Jan 13, 2017 at 8:57 AM, Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org">emmanuel@hibernate.org</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; s/other/order from the JVM/<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt; On 13 Jan 2017, at 15:54, Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org">emmanuel@hibernate.org</a>&gt;<br>
&gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; I looked at that, and I’m not sure you are guaranteed to get an other.<br>
&gt;&gt;&gt; &gt; Plus you have this problem<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; @Min<br>
&gt;&gt;&gt; &gt; @Min.List({@Min, @Min})<br>
&gt;&gt;&gt; &gt; @Min<br>
&gt;&gt;&gt; &gt; BooYahh foo;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I would have thought the same; however per [1] order is guaranteed. Your<br>
&gt;&gt; additional concern is still there. Maybe it would be cleaner to support this<br>
&gt;&gt; using meta-constraint annotations.<br>
&gt;<br>
&gt;<br>
&gt; Actually, per the same section of the JLS, your example is referred to as<br>
&gt; &quot;obtuse&quot; (which I&#39;m sure was the point you were making) would generate a<br>
&gt; compile error. So we could perhaps support Gunnar&#39;s approach after all. A<br>
&gt; meta-annotation might look cleaner, but it might become painful to define a<br>
&gt; lot of these.<br>
&gt;<br>
&gt; Matt<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; On 13 Jan 2017, at 15:22, Gunnar Morling &lt;<a href="mailto:gunnar@hibernate.org">gunnar@hibernate.org</a>&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; As a variation of Matt&#39;s idea, an optional index() parameter could be<br>
&gt;&gt;&gt; &gt;&gt; added:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;   @Size(1)<br>
&gt;&gt;&gt; &gt;&gt;   @Size(3)<br>
&gt;&gt;&gt; &gt;&gt;   @ApplyConstraintTo(constraint=<wbr>Size.class, index=1,<br>
&gt;&gt;&gt; &gt;&gt; target=WRAPPED_VALUE)<br>
&gt;&gt;&gt; &gt;&gt;   List&lt;String&gt; nicknames;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; It could be omitted (via a default value of -1 or similar) if there is<br>
&gt;&gt;&gt; &gt;&gt; only one constraint of the type in question:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;   @NotNull<br>
&gt;&gt;&gt; &gt;&gt;   @Email<br>
&gt;&gt;&gt; &gt;&gt;   @ApplyConstraintTo(constraint=<wbr>NotNull.class,<br>
&gt;&gt;&gt; &gt;&gt; target=ANNOTATED_ELEMENT)<br>
&gt;&gt;&gt; &gt;&gt;   Optional&lt;String&gt; email;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Does the trick, though it&#39;s still a tad verbose.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; 2017-01-13 14:58 GMT+01:00 Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org">emmanuel@hibernate.org</a>&gt;:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; On 13 Jan 2017, at 13:29, Guillaume Smet &lt;<a href="mailto:guillaume.smet@gmail.com">guillaume.smet@gmail.com</a>&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; On Fri, Jan 13, 2017 at 1:01 PM, Gunnar Morling<br>
&gt;&gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:gunnar@hibernate.org">gunnar@hibernate.org</a>&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Unfortunately, validationAppliesTo() is already taken:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; <a href="http://beanvalidation.org/latest-draft/spec/#constraintsdefinitionimplementation-constraintdefinition-validationappliesto" rel="noreferrer" target="_blank">http://beanvalidation.org/<wbr>latest-draft/spec/#<wbr>constraintsdefinitionimplement<wbr>ation-constraintdefinition-<wbr>validationappliesto</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; It&#39;s used to distinguish between return value and cross-parameter<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; constraints.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Any other name I can think of right now would make up for much<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; confusion with that option.<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Too good to be true :).<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; That being said, I&#39;m wondering if we could reuse it and just add 2<br>
&gt;&gt;&gt; &gt;&gt;&gt; other<br>
&gt;&gt;&gt; &gt;&gt;&gt; values to ConstraintTarget. All in all, it&#39;s the same concept. The<br>
&gt;&gt;&gt; &gt;&gt;&gt; default<br>
&gt;&gt;&gt; &gt;&gt;&gt; being IMPLICIT is not too bad either.<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Right I think it’s worth exploring.<br>
&gt;&gt;&gt; &gt;&gt;&gt; I still like my group repurposing trick though even if it offenses<br>
&gt;&gt;&gt; &gt;&gt;&gt; the clean<br>
&gt;&gt;&gt; &gt;&gt;&gt; camp :)<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I still can&#39;t figure out how you would use the group trick in conjunction<br>
&gt;&gt; with validation of a &quot;real&quot; group.<br>
&gt;&gt;<br>
&gt;&gt; Matt<br>
&gt;&gt;<br>
&gt;&gt; [1] <a href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7.5" rel="noreferrer" target="_blank">http://docs.oracle.com/javase/<wbr>specs/jls/se8/html/jls-9.html#<wbr>jls-9.7.5</a><br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt;&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt; &gt;&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
&gt;&gt;&gt; &gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a><br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt; &gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
&gt;&gt;&gt; &gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a><br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt; &gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
&gt;&gt;&gt; &gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; beanvalidation-dev mailing list<br>
&gt;&gt;&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; ______________________________<wbr>_________________<br>
&gt; beanvalidation-dev mailing list<br>
&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a><br>
<br>
______________________________<wbr>_________________<br>
beanvalidation-dev mailing list<br>
<a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.<wbr>jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/<wbr>beanvalidation-dev</a></div></div></blockquote></div><br></div></div>