使用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;

}

回答:

每个字段约束都应由不同的验证者注释处理,换句话说,不建议对一个字段进行其他字段的验证注释检查。跨领域验证应在课程级别进行。另外,JSR-303第2.2节表示同一类型的多个验证的首选方法是通过注释列表。这样可以在每次匹配中指定错误消息。

例如,验证通用格式:

@FieldMatch.List({

@FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"),

@FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")

})

public class UserRegistrationForm {

@NotNull

@Size(min=8, max=25)

private String password;

@NotNull

@Size(min=8, max=25)

private String confirmPassword;

@NotNull

@Email

private String email;

@NotNull

@Email

private String confirmEmail;

}

注释:

package constraints;

import constraints.impl.FieldMatchValidator;

import javax.validation.Constraint;

import javax.validation.Payload;

import java.lang.annotation.Documented;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;

import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Retention;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Target;

/**

* Validation annotation to validate that 2 fields have the same value.

* An array of fields and their matching confirmation fields can be supplied.

*

* Example, compare 1 pair of fields:

* @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match")

*

* Example, compare more than 1 pair of fields:

* @FieldMatch.List({

* @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"),

* @FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")})

*/

@Target({TYPE, ANNOTATION_TYPE})

@Retention(RUNTIME)

@Constraint(validatedBy = FieldMatchValidator.class)

@Documented

public @interface FieldMatch

{

String message() default "{constraints.fieldmatch}";

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

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

/**

* @return The first field

*/

String first();

/**

* @return The second field

*/

String second();

/**

* Defines several <code>@FieldMatch</code> annotations on the same element

*

* @see FieldMatch

*/

@Target({TYPE, ANNOTATION_TYPE})

@Retention(RUNTIME)

@Documented

@interface List

{

FieldMatch[] value();

}

}

验证者:

package constraints.impl;

import constraints.FieldMatch;

import org.apache.commons.beanutils.BeanUtils;

import javax.validation.ConstraintValidator;

import javax.validation.ConstraintValidatorContext;

public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>

{

private String firstFieldName;

private String secondFieldName;

@Override

public void initialize(final FieldMatch constraintAnnotation)

{

firstFieldName = constraintAnnotation.first();

secondFieldName = constraintAnnotation.second();

}

@Override

public boolean isValid(final Object value, final ConstraintValidatorContext context)

{

try

{

final Object firstObj = BeanUtils.getProperty(value, firstFieldName);

final Object secondObj = BeanUtils.getProperty(value, secondFieldName);

return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);

}

catch (final Exception ignore)

{

// ignore

}

return true;

}

}

以上是 使用Hibernate Validator(JSR 303)进行跨字段验证 的全部内容, 来源链接: utcz.com/qa/421753.html

回到顶部