为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate Validator交叉字段验证(JSR 303)

Hibernate Validator交叉字段验证(JSR 303)

Hibernate Validator交叉字段验证(JSR 303)Hibernate Validator 4.x中是否有交叉字段验证的实现(或第三方实现)?如果不是,实现交叉字段验证器的最干净的方法是什么?例如,如何使用API来验证两个bean属性是否相等(例如验证密码字段与密码验证字段匹配)。在注释中,我希望类似于:public class MyBean {   @Size(min=6, max=50)   private String pass;   @Equals(property="pass")   private String passVerify;}
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我建议你另一个可能的解决办法。也许不那么优雅,但更容易!

public class MyBean {
  @Size(min=6, max=50)
  private String pass;

  private String passVerify;

  @AssertTrue(message="passVerify field should be equal than pass field")
  private boolean isValid() {
    return this.pass.equals(this.passVerify);
  }}

这个isValid方法由验证器自动调用。


查看完整回答
反对 回复 2019-06-19
?
森栏

TA贡献1810条经验 获得超5个赞

我很惊讶这个没被打开。无论如何,这里有一个可能的解决方案。

我已经创建了一个类级验证器,而不是原始问题中描述的字段级别。

下面是注释代码:

package com.moa.podium.util.constraints;import static java.lang.annotation.ElementType.*;import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;
import javax.validation.Constraint;import javax.validation.Payload;@Target({TYPE, ANNOTATION_TYPE})@Retention(RUNTIME)
@Constraint(validatedBy = MatchesValidator.class)@Documentedpublic @interface Matches {

  String message() default "{com.moa.podium.util.constraints.matches}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  String field();

  String verifyField();}

而验证器本身:

package com.moa.podium.util.constraints;import org.mvel2.MVEL;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MatchesValidator implements ConstraintValidator<Matches, Object> {

  private String field;
  private String verifyField;


  public void initialize(Matches constraintAnnotation) {
    this.field = constraintAnnotation.field();
    this.verifyField = constraintAnnotation.verifyField();
  }

  public boolean isValid(Object value, ConstraintValidatorContext context) {
    Object fieldObj = MVEL.getProperty(field, value);
    Object verifyFieldObj = MVEL.getProperty(verifyField, value);

    boolean neitherSet = (fieldObj == null) && (verifyFieldObj == null);

    if (neitherSet) {
      return true;
    }

    boolean matches = (fieldObj != null) && fieldObj.equals(verifyFieldObj);

    if (!matches) {
      context.disableDefaultConstraintViolation();
      context.buildConstraintViolationWithTemplate("message")
          .addNode(verifyField)
          .addConstraintViolation();
    }

    return matches;
  }}

注意,我使用了MVEL来检查被验证对象的属性。这可以用标准反射API代替,或者如果它是您正在验证的特定类,则访问器方法本身。

然后,可以在bean上使用@Matters注释,如下所示:

@Matches(field="pass", verifyField="passRepeat")public class AccountCreateForm {

  @Size(min=6, max=50)
  private String pass;
  private String passRepeat;

  ...}

作为一个免责声明,我在最后5分钟写了这个,所以我可能还没有解决所有的bug。如果出了什么问题,我会更新答案的。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 2091 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信