Hibernate Validator - 动态验证消息
Hibernate Validator - Dynamic Validation-Message
我有一个包含三个字段的 class X
:state
(A
和 B
的枚举),a
和 b
。
当state
是A
时,a
一定不能是null
,当state
是B
时,b
一定不能是null
.
@ValidateCondition(message = "Validation failed")
public class X {
private State state;
private String a;
private String b;
}
使用休眠验证器,我构建了以下验证器:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidator.class)
@Documented
public @interface ValidateCondition {
String message() default "ValidateCondition failed";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MyValidator implements ConstraintValidator<ValidateCondition, X> {
@Override
public boolean isValid(X x, ConstraintValidatorContext context) {
if(x.getState()==State.A){
return x.getA() != null;
}
if(x.getState()==State.B){
return x.getB() != null;
}
}
}
因此,每当验证失败时,我目前都会收到消息 Validation failed
,但我想要的是一条消息,告诉我失败的原因,例如 Since state was B, b must not be blank
.
我假设我可以以某种方式使用 ConstraintValidatorContext
,但我不知道是否或如何。
很简单:
只需调用 isValid 区域内的上下文:
context.buildConstraintViolationWithTemplate("message here");
尽情享受吧!
我有一个包含三个字段的 class X
:state
(A
和 B
的枚举),a
和 b
。
当state
是A
时,a
一定不能是null
,当state
是B
时,b
一定不能是null
.
@ValidateCondition(message = "Validation failed")
public class X {
private State state;
private String a;
private String b;
}
使用休眠验证器,我构建了以下验证器:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidator.class)
@Documented
public @interface ValidateCondition {
String message() default "ValidateCondition failed";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MyValidator implements ConstraintValidator<ValidateCondition, X> {
@Override
public boolean isValid(X x, ConstraintValidatorContext context) {
if(x.getState()==State.A){
return x.getA() != null;
}
if(x.getState()==State.B){
return x.getB() != null;
}
}
}
因此,每当验证失败时,我目前都会收到消息 Validation failed
,但我想要的是一条消息,告诉我失败的原因,例如 Since state was B, b must not be blank
.
我假设我可以以某种方式使用 ConstraintValidatorContext
,但我不知道是否或如何。
很简单: 只需调用 isValid 区域内的上下文:
context.buildConstraintViolationWithTemplate("message here");
尽情享受吧!