Java下对输入的校验主要是基于jsr303(jsr 380)通过对bean的field加校验注解,就可以让框架自动对bean校验。并且Java自带的校验注解和hibernate的校验注解,基本上把基本的校验覆盖了,非常方便。
使用中,我碰到这样一个问题
class User {
@NotEmpty
@UserExist
String username;
@NotEmpty
String address;
}
对输入的User对象,需要校验username不为空,并且username在系统中存在,这里的@UserExist是自定义的校验注解,通过查询数据库校验用户是否存在。
问题是如果username为空,Java会执行@NotEmpty
和@UserExist
两个校验,但是实际开发中,是不允许空用户名存在的,所以执行了NotEmpty
后,就应该停止校验,这样可以减少一次用户数据表的访问,类似连续&&
的短路机制。
对于这个问题,jsr303已经有现成的方法,通过定义注解执行顺序,可以解决这个问题:
@GroupSequence({User.class, Second.class, Third.class})
class User {
@NotEmpty
@UserExist(groups = Second.class)
String username;
@NotEmpty
String address;
}
Second和Third是一个marker interface,本身没有任何意义,在这里仅作为排序符号。
改成这样后,如果username为空,就会直接退出校验,从而避免无意义执行UserExist校验。
参考: