У меня есть расширение org.springframework.validation.Validator.
public class MyValidator implements Validator {
@Override
public void validate(Object target, Errors errors) {
...
}
}
Моя цель - передать более одной цели методу.
Мне не нравится идея с методом validate
перегрузки, потому что он пахнет как плохой код: validate(Object target1, Object target1, Errors errors)
или создание карты с необходимыми целями.
Будет хорошо знать лучший подход к этому делу.
Мы используем целевой компонент, который содержит все данные, которые необходимо проверить. Что-то вроде
private static final class ParamsBean {
String id;
List<String> oldIds;
}
Затем мы просто бросаем объект. Это самое чистое возможное решение imo, поскольку оно не использует общую Map
или List
неизвестных объектов (хотя кастинг по-прежнему не очень приятный).
Я не пробовал следующий код, но он демонстрирует основную идею о том, как одно поле компонента может быть проверено другим. Надеюсь, это поможет вам
Скажем, у вас есть следующий вид bean
public class MyForm {
private String id;
private List<String> oldIds;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<String> getOldIds() {
return oldIds;
}
public void setOldIds(List<String> oldIds) {
this.oldIds = oldIds;
}
}
и свойство id должно быть проверено против объекта oldIds (если я правильно понял ваши требования). Для этого вам необходимо создать ограничение и пометить ваш bean-компонент. Итак, первый - это интерфейс ограничения
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.validation.Constraint;
import javax.validation.Payload;
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
@Documented
public @interface MyConstraint {
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String[] value();
}
Далее вам нужно реализовать класс проверки достоверности:
import java.util.List;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.beanutils.PropertyUtils;
public class MyConstraintValidator implements
ConstraintValidator<MyConstraint, Object> {
private String firstAttribute;
private String secondAttribute;
@Override
public void initialize(final MyConstraint constraintAnnotation) {
firstAttribute = constraintAnnotation.value()[0];
secondAttribute = constraintAnnotation.value()[1];
}
@Override
public boolean isValid(final Object object,
final ConstraintValidatorContext constraintContext) {
try {
final String id = (String) PropertyUtils.getProperty(object,
firstAttribute);
List<String> oldIds = (List<String>) PropertyUtils.getProperty(
object, secondAttribute);
// do your validation
return true;
} catch (final Exception e) {
throw new IllegalArgumentException(e);
}
}
}
наконец, примените созданное ограничение к форме bean
@MyConstraint(value = { "id", "oldIds" })
public class MyForm {
// the code
}
На данный момент ваша метка вашего компонента с аннотацией @Valid из пакета javax.validation или передайте его в объект проверки подлинности
я столкнулся с аналогичной ситуацией, когда мне нужно передать больше аргументов методу проверки, поэтому я придумал идею своего собственного. В моем случае мне захотелось передать String этому методу
метод проверки, реализованный в следующих классах: CustomValidatorBean
, LocalValidatorFactoryBean
, OptionalValidatorFactoryBean
, SpringValidatorAdapter
Я расширил CustomValidatorBean
и назвал метод проверки в суперклассе, и он отлично работает
import javax.validation.Validator;'
import org.apache.commons.lang3.StringUtils;'
import org.springframework.validation.Errors;'
importorg.springframework.validation.beanvalidation.CustomValidatorBean;'
public class MyValidator extends CustomValidatorBean {'
public void myvalidate(Object target,Errors errors,String flag,Profile profile)
{
super.validate(target,errors);
if(StringUtils.isEmpty(profile.name())){
errors.rejectValue("name", "NotBlank.profilereg.name", new Object[] { "name" }, "Missing Required Fields");
}
}
}