Spring MVC Validation для списка и сообщения о недопустимом значении

У меня есть список строк, которые должны быть определенного формата. Мне нужно вернуть сообщение об ошибке со строками, которые не имеют указанного формата. Как это сделать с весенней проверкой (я использую валидатор гибернации). Аннотация:

@Documented
@Retention(RUNTIME)
@Target({FIELD, METHOD})
@Constraint(validatedBy = HostsValidator.class)
public @interface HostsConstraint {
    String message();

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

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

Реализация:

public class HostsValidator implements ConstraintValidator<HostsConstraint, List<String>>{

    @Override
    public void initialize(OriginHostsConstraint constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<String> strings, ConstraintValidatorContext context) {
        for (String s : strings) {
            if (!s.matches("[0-9]+") {
                //How do I say: Invalid string <s> ?
                return false;
            }
        }

    }

}

Использование:

public class Test {

    @HostsConstraint(message="Invalid string ")
    private List<String> hosts;

}

Использование validatedValue даст весь список.


person falcon    schedule 15.12.2017    source источник


Ответы (2)


Используйте проверку JSR 380, она допускает ограничения элементов контейнера.

Вот ссылка на раздел элемента контейнера в Hibernate Validator 6.0.6.FINAL Document

person DwB    schedule 15.12.2017

Я думаю, что нашел решение, но оно связано с гибернационным валидатором. Может быть, это даже хакерская реализация.

Использование:

public class Test {

    @HostsConstraint(message="Invalid string : ${invalidStr}")
    private List<String> hosts;

}

Реализация

public class HostsValidator implements ConstraintValidator<HostsConstraint, List<String>>{

    @Override
    public void initialize(OriginHostsConstraint constraintAnnotation) {}

    @Override
    public boolean isValid(List<String> strings, ConstraintValidatorContext context) {
        for (String s : strings) {
            if (!s.matches("[0-9]+") {
                ConstraintValidatorContextImpl contextImpl =
                    (ConstraintValidatorContextImpl) context
                        .unwrap(HibernateConstraintValidatorContext.class);
                contextImpl.addExpressionVariable("invalidStr", s);
                return false;
            }
        }
    }
}
person falcon    schedule 15.12.2017