java - BeanValidation 的上下文相关验证

标签 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”属性都不能为空。如果它的角色为“user”,则只有“a”不能为空,其他 Prop 必须为空。

所以基本上这些规则可以很容易地实现为 Alphabet 类的类级别约束,但自定义 validator 需要以某种方式访问​​ URL 中提供的用户 ID。有没有什么聪明的方法可以实现这一点,或者我必须强制所有 REST 客户端多次传递用户 ID:在 URL 和有效负载中,以便后者仅由 BV 使用。 更复杂的情况是验证规则取决于登录的用户,因此自定义 validator 必须以某种方式从 ThreadLocal 或 HttpServletRequest 访问经过身份验证的主体。

最佳答案

您可以使用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;
}

根据当前用户的角色,您可以在调用 validator 时指定 AdminChecksUserChecks,例如管理员检查如下:

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

关于java - BeanValidation 的上下文相关验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182638/

相关文章:

java - 如何通过提供 POST-only @Valid 来删除冗余的 Spring MVC 方法?

java - 当自定义 validator 使用 @Component 注释时,JSR-303 验证将被忽略

java - MongoDB:IllegalStateException:Spring Boot 应用程序中的池已关闭错误消息

java - 如何让 Swing 为 JLabel/JButton/等使用我自己的 HTMLEditorKit

java - 根据条件单击按钮时显示确认弹出窗口

java - 如何在所有子构造函数中自动包含父方法的执行?

Java Bean Validation 2.0 Hibernate Validator - 具有外部 XML 配置的可执行 JAR

java - Java 中有哪些不同的 jar 文件,以及如何将它们导入到 Eclipse 中?

java - 在bean验证消息模板中使用bean属性参数

java - CDI 和 servlet 应用程序中的 BeansValidation