Spring Custom Validator - интерполировать сообщение с параметром - PullRequest
0 голосов
/ 17 января 2019

Я создал пользовательский ConstraintValidator, где метод isValid выглядит следующим образом:

private String message;

@Override
public void initialize(InputValidator constraintAnnotation) {
    this.message = constraintAnnotation.message();
}

@Override
public boolean isValid(String inputValue, ConstraintValidatorContext context) {
    HibernateConstraintValidatorContext h = context.unwrap(HibernateConstraintValidatorContext.class);
    h.disableDefaultConstraintViolation();

    //logic goes here

    if(!valid) {
        h.addExpressionVariable("0", inputValue);
        h.buildConstraintViolationWithTemplate(this.message)
            .addConstraintViolation();
    }
    return valid;
}

У меня также есть следующее в messages.properties:

error.input=The value {0} is invalid.

Я могу использовать вышеупомянутое сообщение и подставить значение {0} внутри при использовании его в пределах тимелиста и с бобом MessageSource, однако HibernateConstraintValidatorContext не заменит значение.

Учитывая ограничения моего проекта, я не могу изменить формат сообщения, например, изменив его на The value ${0} is invalid..

В настоящее время у меня есть приложение, отображающее ответ «Значение userInput недопустимо» где «userInput» - это имя поля в форме / объекте.

1 Ответ

0 голосов
/ 17 января 2019

Итак, {0} - параметр сообщения, а ${0} - переменная выражения.

Вы должны использовать #addMessageParameter() вместо #addExpressionVariable(). Он был введен в Hibernate Validator 5.4.1, но вам все равно следует обновить его, если вы используете более старую версию.

...