我不知道Spring,但要了解我通过Spring教程阅读的一些java模式,并偶然发现下面的代码。从它看起来,这看起来像经典装饰,但你看到ValidationUtils.invokeValidator(this.addressValidator, customer.getAddress(), errors);
。我使用实用程序委托给另一个验证器有点不舒服,因为我觉得单元测试这些静态调用很困难(虽然它可以通过PowerMock实现,但不是同样的忠实粉丝)。我觉得addressValidator.validate()
非常清晰。因为我正在为我的应用程序编写一个自定义验证器,我只是想对这些方法有所了解。
public class CustomerValidator implements Validator {
private final Validator addressValidator;
public CustomerValidator(Validator addressValidator) {
this.addressValidator = addressValidator;
}
public boolean supports(Class clazz) {
return Customer.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "field.required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "surname", "field.required");
Customer customer = (Customer) target;
try {
errors.pushNestedPath("address");
ValidationUtils.invokeValidator(this.addressValidator, customer.getAddress(), errors);
} finally {
errors.popNestedPath();
}
}
}