开发者

Control validation annotations order?

开发者 https://www.devze.com 2023-02-22 18:57 出处:网络
A field has two validation annotations @NotEmpty @Length(min=3,max=100) String firstName; Observation If that field is left empty, the开发者_运维问答n the resulting violations vary in order:

A field has two validation annotations

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

Observation

If that field is left empty, the开发者_运维问答n 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.


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号