当前位置: 首页 > 知识库问答 >
问题:

基于活动验证组的同一字段不同验证

公冶京
2023-03-14

我正在尝试使用<code>Hibernate Validator</code>验证请求对象。

作为一个简单的例子,假设我要验证的对象的类有一个<code>B bObj</code>字段,其中<code>B

因此,我实现了自己的自定义Constraint Annotations,它链接到自定义MyValidator实现ConstraintValidator类。

DTO类

@AclassValidate(groups = {Operations.Insert.class, Operations.Update.class javax.validation.groups.Default.class})
public class A {

    @BclassValidate(groups = {Operations.Insert.class, Operations.Update.class})
    private B bObj;

    // setters, getters
}

我的endpoint方法签名(其中调用验证器,并设置活动组):

@PostMapping("/test")
public A createA(
        @Validated(value = Operations.Insert.class) 
        // @Validated(value = Operations.Update.class) 
        @RequestBody A a
)

我的验证器类

public class BclassValidator implements ConstraintValidator<BclassValidate, B> {

    public void initialize(BclassValidate constraintAnnotation) {
    }

    public boolean isValid(B b, ConstraintValidatorContext constraintContext) {

        boolean valid = true;

        // Get active group here
        activeGroup = ..?
        if (activeGroup == Operations.Insert.class) {
            // check if b.getName() equals to "John"
        }
        else if (activeGroup == Operations.Update.class) {
            // check if b.getName() equals to "Doe"
        }

        return valid;
    }
}

我想要实现的是基于活动组对同一字段应用不同的验证。活动组是在批注@Validated设置的组。问题是如何检索活动组以便根据其值应用不同的验证?

共有3个答案

寇涵容
2023-03-14

Hibernate验证器使用自定义约束的配置组验证当前活动的组,因此我们无需编写逻辑来验证它。但是没有办法找到当前活跃的组。

原因:“value eContext”持有当前活动的组,但没有传递给“isValid”方法。

https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java

井唯
2023-03-14

您应该像这样获取活动验证组:

public class BclassValidator implements ConstraintValidator<BclassValidate, B> {

    public void initialize(BclassValidate constraintAnnotation) {
    }

    public boolean isValid(B b, ConstraintValidatorContext constraintContext) {

        boolean valid = true;

        // Get active group here
        Set<Class<?>> activeGroups = null;
        if (context instanceof ConstraintValidatorContextImpl) {
            activeGroups = ((ConstraintValidatorContextImpl) context).getConstraintDescriptor().getGroups();
        } else {
            activeGroups = Collections.emptySet();
        }

        if (activeGroups.contains(Operations.Insert.class)) {
            // check if b.getName() equals to "John"
        }
        else if (activeGroups.contains(Operations.Update.class)) {
            // check if b.getName() equals to "Doe"
        }

        return valid;
    }
}
冀萧迟
2023-03-14

您无法从约束验证程序中获取当前已验证的组。

相反,您应该将约束分成几个约束,在您的情况下,一个用于插入,一个用于更新。然后您可以将这些单独的约束分配给每个验证组。

 类似资料:
  • 我开始使用验证框架用jax-rs验证json请求 是否可以根据另一个字段验证一个字段? 提前致谢

  • 参考以下pojo: 我的应用程序基本上是一个基于Spring启动的REST API,它公开了两个endpoint,一个用于创建用户,另一个用于检索用户。 “用户”属于某些类别,a组、b组等。我从帖子请求的标题中获得。 我需要在运行时验证用户数据,并且验证可能因用户组而异。 例如,属于a组的用户可能将电话号码作为可选字段,而对于其他组,它可能是必填字段。 正则表达式也可能因组而异。 我需要能够配置s

  • 数据库字段约束 模型验证允许你为模型的每个属性指定格式/内容/继承验证. 验证会自动运行在create,update和save上. 你也可以调用validate()手动验证一个实例. class ValidateMe extends Model {} ValidateMe.init({ bar: { type: Sequelize.STRING, valid

  • 我有一个示例JSON响应 如何验证何时然后当然后 尝试过类似的东西,但它不起作用。 我错过了什么还是做错了什么?

  • 问题内容: 有没有一种方法可以使用此处定义的注释来定义Hibernate验证规则,说明至少一个字段不能为null? 这将是一个假设的示例(实际上不存在): 在所示的情况下,fieldA可以为null或fieldB可以为null,但不能同时为两者。 一种方法是创建自己的验证器,但是我想避免它已经存在。如果您已经验证过,请分享一个验证人…谢谢! 问题答案: 我终于写了整个验证器: 用法示例:

  • 对于my Identity Server 4,我们设置了两个不同的服务器来承载应用程序。我要求我们的运营团队在两台服务器上安装相同的证书。但是,它们都收到了不同的指纹,并且在以下字段中,证书中的值是不同的:kid、x5t、n,当我加载时,x5c链中的值在两者之间也是不同的。众所周知的/openid配置/jwks地址。我已经把钥匙贴在下面了。这样行吗?我以为x5c的值是一样的。0值,如果它们基于相同