如何将更多参数传递给spring validate方法

时间:2014-03-18 13:27:23

标签: java spring validation

我有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)或创建包含所需目标的地图。

对于这种情况,了解更好的方法会很好。

3 个答案:

答案 0 :(得分:4)

我们使用一个目标bean来保存所有需要验证的数据。像

这样的东西
private static final class ParamsBean {
  String id;
  List<String> oldIds;
}

然后我们简单地投射对象。这是最干净的解决方案imo,因为它不使用通用的MapList未知对象(尽管转换仍然不好)。

答案 1 :(得分:3)

我没有尝试下面的代码,但它演示了一个基本的想法,即如何对另一个bean的一个字段进行验证。希望它会帮助你

我们假设您有以下表单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;
    }

}

并且必须针对oldIds对象验证id属性(如果我确实理解了您的要求)。为了实现它,您需要创建约束并标记您的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
}

现在,您使用javax.validation包中的@Valid注释标记您的bean或将其提供给验证器对象

答案 2 :(得分:0)

我面临类似的情况,我需要传递更多参数到validate方法,所以我想出了我自己的想法。在我的情况下,我想要一个字符串传递给这个方法

验证在以下类CustomValidatorBeanLocalValidatorFactoryBeanOptionalValidatorFactoryBeanSpringValidatorAdapter

中实施的方法

我扩展了CustomValidatorBean并在超类中调用了validate方法,它运行得很好

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");
        }       

    }           

}