Java bean验证顺序

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校验。

参考:

  • bean validation basics
  • set check order for jsr 303 bean validation

你可能感兴趣的:(Java bean验证顺序)