我是JSR 303 BV的忠实粉丝,但在我目前的项目中,我有很多“依赖于上下文的验证”,我没有找到任何合理的方法来实现它们与BV。 基本上验证规则可以依赖于
一个小例子:
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。
答案 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;
}
根据当前用户的角色,您可以在调用验证程序时指定AdminChecks
或UserChecks
,例如像这样管理员检查:
Validator validator = ...;
Set<ConstraintViolation<Alphabet>> violations = validator.validate(
new Alphabet(),
AdminChecks.class
);