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;}


呼如林
浏览 2158回答 3
3回答

缥缈止盈

我建议你另一个可能的解决办法。也许不那么优雅,但更容易!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方法由验证器自动调用。

森栏

我很惊讶这个没被打开。无论如何,这里有一个可能的解决方案。我已经创建了一个类级验证器,而不是原始问题中描述的字段级别。下面是注释代码:package&nbsp;com.moa.podium.util.constraints;import&nbsp;static&nbsp;java.lang.annotation.ElementType.*;import&nbsp;static&nbsp;java.lang.annotation.RetentionPolicy.*; import&nbsp;java.lang.annotation.Documented;import&nbsp;java.lang.annotation.Retention;import&nbsp;java.lang.annotation.Target; import&nbsp;javax.validation.Constraint;import&nbsp;javax.validation.Payload;@Target({TYPE,&nbsp;ANNOTATION_TYPE})@Retention(RUNTIME) @Constraint(validatedBy&nbsp;=&nbsp;MatchesValidator.class)@Documentedpublic&nbsp;@interface&nbsp;Matches&nbsp;{ &nbsp;&nbsp;String&nbsp;message()&nbsp;default&nbsp;"{com.moa.podium.util.constraints.matches}"; &nbsp;&nbsp;Class<?>[]&nbsp;groups()&nbsp;default&nbsp;{}; &nbsp;&nbsp;Class<?&nbsp;extends&nbsp;Payload>[]&nbsp;payload()&nbsp;default&nbsp;{}; &nbsp;&nbsp;String&nbsp;field(); &nbsp;&nbsp;String&nbsp;verifyField();}而验证器本身:package&nbsp;com.moa.podium.util.constraints;import&nbsp;org.mvel2.MVEL;import&nbsp;javax.validation.ConstraintValidator; import&nbsp;javax.validation.ConstraintValidatorContext;public&nbsp;class&nbsp;MatchesValidator&nbsp;implements&nbsp;ConstraintValidator<Matches,&nbsp;Object>&nbsp;{ &nbsp;&nbsp;private&nbsp;String&nbsp;field; &nbsp;&nbsp;private&nbsp;String&nbsp;verifyField; &nbsp;&nbsp;public&nbsp;void&nbsp;initialize(Matches&nbsp;constraintAnnotation)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.field&nbsp;=&nbsp;constraintAnnotation.field(); &nbsp;&nbsp;&nbsp;&nbsp;this.verifyField&nbsp;=&nbsp;constraintAnnotation.verifyField(); &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;boolean&nbsp;isValid(Object&nbsp;value,&nbsp;ConstraintValidatorContext&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;fieldObj&nbsp;=&nbsp;MVEL.getProperty(field,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;verifyFieldObj&nbsp;=&nbsp;MVEL.getProperty(verifyField,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;neitherSet&nbsp;=&nbsp;(fieldObj&nbsp;==&nbsp;null)&nbsp;&&&nbsp;(verifyFieldObj&nbsp;==&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(neitherSet)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;matches&nbsp;=&nbsp;(fieldObj&nbsp;!=&nbsp;null)&nbsp;&&&nbsp;fieldObj.equals(verifyFieldObj); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!matches)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.disableDefaultConstraintViolation(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.buildConstraintViolationWithTemplate("message") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addNode(verifyField) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addConstraintViolation(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;matches; &nbsp;&nbsp;}}注意,我使用了MVEL来检查被验证对象的属性。这可以用标准反射API代替,或者如果它是您正在验证的特定类,则访问器方法本身。然后,可以在bean上使用@Matters注释,如下所示:@Matches(field="pass",&nbsp;verifyField="passRepeat")public&nbsp;class&nbsp;AccountCreateForm&nbsp;{ &nbsp;&nbsp;@Size(min=6,&nbsp;max=50) &nbsp;&nbsp;private&nbsp;String&nbsp;pass; &nbsp;&nbsp;private&nbsp;String&nbsp;passRepeat; &nbsp;&nbsp;...}作为一个免责声明,我在最后5分钟写了这个,所以我可能还没有解决所有的bug。如果出了什么问题,我会更新答案的。
打开App,查看更多内容
随时随地看视频慕课网APP