我有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)
或创建包含所需目标的地图。
对于这种情况,了解更好的方法会很好。
答案 0 :(得分:4)
我们使用一个目标bean来保存所有需要验证的数据。像
这样的东西private static final class ParamsBean {
String id;
List<String> oldIds;
}
然后我们简单地投射对象。这是最干净的解决方案imo,因为它不使用通用的Map
或List
未知对象(尽管转换仍然不好)。
答案 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方法,所以我想出了我自己的想法。在我的情况下,我想要一个字符串传递给这个方法
验证在以下类CustomValidatorBean
,LocalValidatorFactoryBean
,OptionalValidatorFactoryBean
,SpringValidatorAdapter
我扩展了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");
}
}
}