Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Control validation annotations order?

A field has two validation annotations

@NotEmpty
@Length(min=3,max=100)
String firstName;

Observation

If that field is left empty, then the resulting violations vary in order:

  • sometimes the @NotEmpty is violated first
  • other times the @Length is violated first

Questions

How does Hibernate specify the order in which validations (annotations) are processed? Can this validation order be customized?

Thanks in advance.

like image 555
Mahmoud Saleh Avatar asked Apr 06 '11 18:04

Mahmoud Saleh


2 Answers

Use JSR-303 validation groups.

If no groups are specified a constraint is part of the Default Bean Validation group (see: javax.validation.groups.Default).

Create an interface to be your "Extended" (or whatever you want to call it) group:

public interface Extended{}

Now create an interface that will have the javax.validation.GroupSequence annotation.

@GroupSequence({Default.class, Extended.class})
public interface MySequence {}

Set the validation groups on your constraints

@NotEmpty // If no group is specified it is part of the default group
@Length(min=3,max=100, groups = Extended.class)
String firstName;

Pass MySequence to your validator call.

validator.validate(object, MySequence.class);

As specified by your @GroupSequence the default constraints will be validated first and if no contraint violations are encountered it will move on to the extended group.

like image 191
Wilhelm Kleu Avatar answered Nov 05 '22 12:11

Wilhelm Kleu


Just to add to the above answer, the group sequence could also be done at the Class level where validations have been defined. For example:

Provided we have two interfaces

public interface FirstOrder{}
public interface SecondOrder{}

We could define them as a group sequence as below

@GroupSequence({MyTestClass.class,FirstOrder.class,SecondOrder.class})
public class MyTestClass{

@NotBlank(groups = FirstOrder.class)    
@Length(min=3, max=100, groups = SecondOrder.class)
private String name; 

}

Advantage of doing the group sequence this way is -

You do not need an extra interface to define the group sequence and as a result you do not need to pass that to the validator for your unit/IT tests.

like image 7
Radioactive Avatar answered Nov 05 '22 14:11

Radioactive