[bv-dev] Container element validation for arrays

Gunnar Morling gunnar at hibernate.org
Wed Apr 19 08:04:01 EDT 2017


2017-04-19 13:46 GMT+02:00 Emmanuel Bernard <emmanuel at hibernate.org>:
> What you are inferring is that the JLS made an incompatible move right?
> Because before Java 8, @Size(max=5) String[] was meant to be applied on
> the array right?

It's not incompatible. Before, there were no TYPE_USE annotations. But
now, an annotation can be both at the same time:

    "It is possible for @Foo to be both a declaration annotation and a
type annotation simultaneously."

The thing is that we added TYPE_USE as supported element type for all
built-in annotations, so we now cannot tell apart whether that @Email
is meant as field-level constraint (targeting the array) or as type
annotation (targeting the component type). A new constraint annotation
member or defined payload could be used to provide that information,
but I'd prefer implementations to experiment with that first.

>
> Anyways, I don't think that would be a massive loss to lose array
> support but my background is biased toward preferring collections.

Yes, my thinking, too. It should be possible to add later, though. In
that light spending the cycles on array support wasn't for nothing,
e.g. we found names ("container element constraints") which will work
for both usages down the road.

>
> Emmanuel
>
> On Wed 17-04-19 10:27, Gunnar Morling wrote:
>>Hi,
>>
>>Guillaume made an important observation concerning the validation of
>>array elements. So far we envisioned to support this:
>>
>>    String @Email [] emails;
>>
>>That looks nice (provided that @Email supports TYPE_USE), only that
>>it's getting semantics of type annotations for arrays wrong.
>>
>>As per the JLS [1], the @Email annotation here applies to the array
>>type String[], not the component type String. This example from the
>>JLS clarifies the intent:
>>
>>    @C int @A [] @B [] f;
>>
>>    "@A applies to the array type int[][], @B applies to its component
>>type int[],
>>    and @C applies to the element type int."
>>
>>So according to that, our example would have to be:
>>
>>    @Email String[] emails;
>>
>>But obviously this conflicts with the existing semantics of applying
>>constraints to arrays (not their elements) in BV 1.1.
>>
>>So based on that, I don't see a good way for supporting container
>>element constraints for arrays. Hence my suggestion is to not support
>>them in the BV 2.0 spec (the validation of container elements of
>>generic containers - List<@Email String> - is not affected). Specific
>>implementations may explore ways around it (e.g. specifying the target
>>via payload()) and we may revisit it in 2.1.
>>
>>Any thoughts?
>>
>>--Gunnar
>>
>>[1] https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7.4
>>_______________________________________________
>>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