我正在尝试使用<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
设置的组。问题是如何检索活动组以便根据其值应用不同的验证?
Hibernate验证器使用自定义约束的配置组验证当前活动的组,因此我们无需编写逻辑来验证它。但是没有办法找到当前活跃的组。
原因:“value eContext”持有当前活动的组,但没有传递给“isValid”方法。
https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java
您应该像这样获取活动验证组:
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;
}
}
您无法从约束验证程序中获取当前已验证的组。
相反,您应该将约束分成几个约束,在您的情况下,一个用于插入,一个用于更新。然后您可以将这些单独的约束分配给每个验证组。
我开始使用验证框架用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值,如果它们基于相同