Как передать параметры через сообщения Java Validator?

В настоящее время у меня есть что-то вроде

@NotNull(message="{err.required}")
@Size(min=1, message="{err.required}")
private String firstName;

В моем messages.properties у меня есть

err.required={0} is required.

Он работает, но выводит firstName is required., что некрасиво. Он передал имя переменной firstName в качестве параметра в {0}.

Как вместо этого передать что-то вроде "Имя"? Так будет First name is required.


person Rey Libutan    schedule 24.06.2015    source источник
comment
Возможно, для этого можно использовать SpEL. Вы можете взглянуть на него (язык Spring Expression).   -  person Uwe Allner    schedule 24.06.2015


Ответы (1)


Вы можете сделать что-то вроде этого:

@NotNull(message="First name {err.required}")
@Size(min=1, message="First name {err.required}")
private String firstName;

@NotNull(message="Last name {err.required}")
@Size(min=1, message="Last name {err.required}")
private String lastName;

и в файле свойств

err.required= is required. 

или, если вы хотите быть более ясным, вы можете добавить свою собственную аннотацию и валидатор:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { NotEmptyValidator.class })
public @interface NotEmpty {

    String message() default "{customMessage} is required.";

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

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

    String customMessage() default "";
}

public class NotEmptyValidator implements ConstraintValidator<NotEmpty, String>
{
    @Override
    public void initialize(NotEmpty notEmpty)
    {        
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context)
    {
        return value != null && !value.isEmpty();
    }
}

Тогда ваше поле

@NotEmpty(message="{err.required}"
          customMessage="First name")
private String firstName;

И в свойствах (хотя это не обязательно, так как вы можете установить это значение по умолчанию):

err.required={customMessage} is required.
person Random42    schedule 24.06.2015
comment
Это добавит содержимое проверенного поля. Вопрос был о передаче пользовательской строки в сообщении. - person Uwe Allner; 24.06.2015
comment
@UweAllner Я изменил ответ, чтобы охватить то, что, по вашему мнению, имел в виду ОП. - person Random42; 24.06.2015
comment
Уве прав, я не ищу само значение, но я хочу, чтобы в качестве параметра была указана любая строка. Я попробую это позже, как только вернусь домой. Спасибо! - person Rey Libutan; 24.06.2015
comment
@ m3th0dman {customMessage} автоматически добавляется в context? - person beerbajay; 24.06.2015
comment
@beerbajay Да; Я проверил код, и он работает. Обратите внимание, что я использовал реализацию BeanValidation в HibernateValidator, а не SpringValidator, и я не знаю, зависит ли это от реализации или от конкретного API. - person Random42; 24.06.2015
comment
Подтверждено рабочее! Хотя настройка всех подобных валидаторов немного утомительна, это лучше, чем ручная проверка :) Большое спасибо! - person Rey Libutan; 24.06.2015