BeanValidation的上下文相关验证

时间:2013-03-03 05:05:49

标签: java bean-validation

我是JSR 303 BV的忠实粉丝,但在我目前的项目中,我有很多“依赖于上下文的验证”,我没有找到任何合理的方法来实现它们与BV。 基本上验证规则可以依赖于

  • 登录用户(存储在http请求中)
  • 我们采取行动的用户 - 用户的ID是REST URL的路径参数,如/ foo / bar / user / 1 / sth
  • 这两个

一个小例子:

class Alphabet{
@Valid
private Alpha a;
@Valid
private Beta b;
@Valid
private Gamma g;
}

验证规则: 如果在URL中提供其id的用户具有角色“admin”,则“a”,“b”,“g”属性均不为null。如果它具有“user”角色,则“a”必须不为null,其他props必须为null。

所以基本上这些规则可以很容易地实现为Alphabet类的类级别约束,但是自定义验证器需要以某种方式访问​​URL中提供的用户的访问ID。是否有任何智能方法可以实现或者我必须强制所有REST客户端多次传递用户ID:在URL和有效负载中,因此后者将仅由BV使用。 更复杂的情况是验证规则依赖于登录用户,因此自定义验证器必须以某种方式访问​​经过验证的主体 - 来自ThreadLocal或HttpServletRequest。

1 个答案:

答案 0 :(得分:2)

您可以使用validation groups

//Define validation groups
interface AdminChecks {}
interface UserChecks {}

//Assign the constraints to the two groups
class Alphabet{

    @NotNull(groups={AdminChecks.class, UserChecks.class})
    private Alpha a;

    @NotNull(groups=AdminChecks.class)
    @Null(groups=UserChecksChecks.class)
    private Beta b;

    @NotNull(groups=AdminChecks.class)
    @Null(groups=UserChecksChecks.class)
    private Gamma g;
}

根据当前用户的角色,您可以在调用验证程序时指定AdminChecksUserChecks,例如像这样管理员检查:

Validator validator = ...;
Set<ConstraintViolation<Alphabet>> violations = validator.validate(
    new Alphabet(),
    AdminChecks.class
);