Вы можете сделать это, изменив аннотацию, чтобы предоставить описание поля, а затем разоблачить это в валидаторе.
Во-первых, добавьте description
поле в аннотации:
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmptyCheckValidator.class)
@Documented
public @interface EmptyCheck {
String description() default "";
String message() default "{empty.check}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Затем измените свое сообщение так, что он использует именованный параметр; это более читаемо.
empty.check= Please enter ${description}
Поскольку вы используете спящий режим-валидатор, вы можете получить контекст валидатора спящего режима в пределах своего класса валидации и добавить переменный контекст.
public class EmptyCheckValidator
implements ConstraintValidator<EmptyCheck, String> {
String description;
public final void initialize(final EmptyCheck annotation) {
this.description = annotation.description();
}
public final boolean isValid(final String value,
final ConstraintValidatorContext context) {
if(null != value && !value.isEmpty) {
return true;
}
HibernateConstraintValidatorContext ctx =
context.unwrap(HibernateConstraintValidatorContext.class);
ctx.addExpressionVariable("description", this.description);
return false;
}
}
Наконец, добавьте описание в поле:
@EmptyCheck(description = "a user name") private String userName
Это должно произвести следующую ошибку при имя_пользователе является нулевым или пустым:
Please enter a user name
@ beerbajay Спасибо за повтор. Но если в сообщении есть несколько параметров, таких как empty.check = Введите {0} {1}. Как мы можем достичь ...? –
@ShashiDk Вы вызываете 'addExpressionVariable' несколько раз с разными именами переменных. Откуда вы получаете эти параметры? – beerbajay