Как передать больше параметров в метод Spring Spring

1

У меня есть расширение 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) или создание карты с необходимыми целями.

Будет хорошо знать лучший подход к этому делу.

Теги:
spring
validation

3 ответа

4
Лучший ответ

Мы используем целевой компонент, который содержит все данные, которые необходимо проверить. Что-то вроде

private static final class ParamsBean {
  String id;
  List<String> oldIds;
}

Затем мы просто бросаем объект. Это самое чистое возможное решение imo, поскольку оно не использует общую Map или List неизвестных объектов (хотя кастинг по-прежнему не очень приятный).

  • 0
    Спасибо за идею!
  • 0
    @kenor, не могли бы вы рассказать подробнее о том, как передать этот объект ParammsBean в валидатор? У меня есть похожий вопрос с моим кодом здесь stackoverflow.com/questions/49387869/… . Пожалуйста помоги.
2

Я не пробовал следующий код, но он демонстрирует основную идею о том, как одно поле компонента может быть проверено другим. Надеюсь, это поможет вам

Скажем, у вас есть следующий вид 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 или передайте его в объект проверки подлинности

0

я столкнулся с аналогичной ситуацией, когда мне нужно передать больше аргументов методу проверки, поэтому я придумал идею своего собственного. В моем случае мне захотелось передать 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");
        }       

    }           

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню