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
выдаст весь список.
2 ответа
Решение
Используйте проверку JSR 380, она разрешает ограничения элементов контейнера.
Вот ссылка на раздел элемента контейнера в Hibernate Validator 6.0.6.
Я думаю, что нашел решение, но оно связано с валидатором гибернации. Может быть, это даже хакерская реализация.
Использование:
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;
}
}
}
}