[bv-dev] Constraint on non generic types (was Re: Support for constraints on container values (e.g. Collection<@Email String>))

Emmanuel Bernard emmanuel at hibernate.org
Mon Nov 21 08:28:24 EST 2016


> On 7 Nov 2016, at 23:42, Hendrik Ebbers <hendrik.ebbers at me.com> wrote:
> 
> In addition I think that simply adding a constraints annotation to the generic type is wrong. All examples that we have mentioned are just perfect examples in that the generic type defines the content. Let’s say we have a class like this:
> 
> public abstract class ConvertableInteger<V> {
> 
> 	private int value;
> 
> 	public void setValue(int value) { this.value = value; }
> 
> 	public int getValue() { return value; }
> 
> 	public abstract V getConvertedValue();
> }
> 
> If you want to validate an instance of this class you normally want to validate the integer and not the converted value:
> 
> private ConvertableInteger<@Min(2_000_000) Date> myValue;
> 
> Such an expression looks like if you want to validate a Date object. In this case the better solution would be something like this:
> 
> @Min(2_000_000)
> private ConvertableInteger<Date> myValue;
> 
> And now we end in 2 different ways how we annotation value wrappers:
> 
> private CachableValue<@NotEmpty String> myCachedValue;
> 
> @Min(2_000_000)
> private ConvertableInteger<Date> myIntegerValue;

First off, your specific example does not work as is as the class is abstract. You would need an explicit subclass (e.g. DateConvertableInteger extends ConvertableInteger<Date>). And in that situation, The more natural BV approach would be to do this:

public class DateConvertableInteger extend ConvertableInteger<Date> {

    @Min(@2_000_000)
    public int getValue() { return value; }

    @NotEmpty
    public Date getConvertedValue();
}

class SomeClass {
    @Valid
    private StringConvertableInteger myValue;
}

== overriding constraint declarations

Now if you want a way to override the constraints of an embedded (@Valid) object (graph), then I think that is a different subject that we can try and address. JPA for example has the notion of @AttributeOverride. It is more complicated in the case of Bean Validation as we would need to override actual annotations. Not sure how to express that for now. Do we think that it is a valid and important requirement?

To clarify, here is what is required

public class Embeddable {
    @NotEmpty String foo;
}

public class Entity {
    @Valid @Override(path=“foo”, constraints=@Min(3)) // note that this is not valid Java syntax
    Embeddable embeddable;
}

== Constraint on non parameterized containers

That raises another question, the proposal allows to to three things:

- apply constraints on a type use generic declaration(*): Collection<@NotEmpty String> foo;
- apply constraints on specialized generic parameters (*): @Pattern(…) StringProperty prop; //where StringProperty extends Property<String>
- apply constraints on container with no generic: @Min(3) IntegerContainer prop; // where class IntegerContainer{ Integer value; } i.e. no generic

(*) I don’t know the actual proper names so sorry if I butchered notions

I am liking option 3 less and less and as far as I can remember, it does not rely on an explicitly identified use case. Who is wanting to support that usage, vs restrict the container feature to parameterized containers?

I’m not sure I was all that clear, so please ask any question if you have any doubt.

Emmanuel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/beanvalidation-dev/attachments/20161121/bec3fa01/attachment.html 


More information about the beanvalidation-dev mailing list