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)或创建具有所需目标的地图。
最好了解有关此案例的更好方法。
我没有尝试以下代码,但它演示了如何针对另一个字段验证 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,或者将其提供给验证器对象
我们使用一个目标Bean,其中包含所有需要验证的数据。就像是
private static final class ParamsBean {
String id;
List<String> oldIds;
}
Run Code Online (Sandbox Code Playgroud)
然后我们简单地投射对象。这是imo最干净的解决方案,因为它不使用泛型Map或List未知对象(尽管转换仍然不太理想)。
| 归档时间: |
|
| 查看次数: |
6459 次 |
| 最近记录: |