2015-05-29 1 views
2

Привет, я использую валидатор hibernate в сервисе джерси. Вот как мы можем передать значение в сообщение файла свойство следующимПроверка спящего режима с пользовательскими сообщениями в файле свойств

empty.check= Please enter {0} 

здесь в {0} Мне нужно передать значение из аннотаций

@EmptyCheck(message = "{empty.check}") private String userName 

здесь в {0} мне нужно pass "имя пользователя", аналогично мне нужно повторно использовать сообщение

, пожалуйста, помогите мне решить эту проблему.

ответ

3

Вы можете сделать это, изменив аннотацию, чтобы предоставить описание поля, а затем разоблачить это в валидаторе.

Во-первых, добавьте 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 
+0

@ beerbajay Спасибо за повтор. Но если в сообщении есть несколько параметров, таких как empty.check = Введите {0} {1}. Как мы можем достичь ...? –

+0

@ShashiDk Вы вызываете 'addExpressionVariable' несколько раз с разными именами переменных. Откуда вы получаете эти параметры? – beerbajay