如何传递更多参数以弹簧验证方法

fas*_*ser 1 java validation spring

我有org.springframework.validation.Validator的扩展名。

public class MyValidator implements Validator {

    @Override
        public void validate(Object target, Errors errors) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是将多个目标传递给方法。

我不喜欢重载validate方法的想法,因为它闻起来像是不好的代码: validate(Object target1, Object target1, Errors errors)或创建具有所需目标的地图。

最好了解有关此案例的更好方法。

Cyr*_*eba 6

我没有尝试以下代码,但它演示了如何针对另一个字段验证 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

并且 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();
}
Run Code Online (Sandbox Code Playgroud)

接下来,您需要实现约束验证器类:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

最后,将创建的约束应用到表单 bean

@MyConstraint(value = { "id", "oldIds" })
public class MyForm {
    // the code
}
Run Code Online (Sandbox Code Playgroud)

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


ken*_*nor 5

我们使用一个目标Bean,其中包含所有需要验证的数据。就像是

private static final class ParamsBean {
  String id;
  List<String> oldIds;
}
Run Code Online (Sandbox Code Playgroud)

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