使用Spring的Validator接口进行校验
2011-02-23 16:23
555 查看
你可以使用Spring提供的validator接口进行对象的校验。Validator接口与 Errors协同工作,在Spring做校验的时候,它会将所有的校验错误汇总到 Errors对象中去。 来看这个简单的数据对象: public class Person { private String name; private int age; // the usual getters and setters... } 实现 org.springframework.validation.Validator接口中的两个方法,我们将为对 Person类加上校验行为: supports(Class):表示这个 Validator是否支持该 Class的实例? validate(Object, org.springframework.validation.Errors):对提供的对象进行校验,并将校验的错误注册到传入的 Errors对象中。 实现一个 Validator也比较简单,尤其是当你学会了Spring所提供的 ValidationUtils以后。我们一起来看一下如何才能创建一个校验器。 public class PersonValidator implements Validator { /** * This [code]Validatorvalidates just Personinstances */ public boolean supports(Class clazz) { return Person.class.equals(clazz); } public void validate(Object obj, Errors e) { ValidationUtils.rejectIfEmpty(e, "name", "name.empty"); Person p = (Person) obj; if (p.getAge() < 0) { e.rejectValue("age", "negativevalue"); } else if (p.getAge() > 110) { e.rejectValue("age", "too.darn.old"); } } }[/code] 如你所见,我们使用了 ValidationUtils中的一个 静态方法 rejectIfEmpty(..)来对name属性进行校验,假若 'name'属性是 null或者空字符串的话,就拒绝验证通过 。请参照 ValidationUtils相关的JavaDoc,查看一下除了例子中介绍过的之外其他的一些功能。 对复杂对象来说,实现 Validator类来验证其内置的属性类当然也是可行的,但是为每个内置类的示例实现 Validator可能是个更好的主意。关于这样的一个'rich'这样的例子是 Customer类,它包含两个 String属性(first name 和second name),还有一个复杂的 Address对象。 Address对象可能独立于 Customer对象,因此独立实现了一个 AddressValidator。假若你希望你的 CustomerValidator重用 AddressValidator内部的逻辑,但是又不想通过拷贝粘贴来实现,你可以在你的 CustomerValidator中依赖注入 AddressValidator对象,或者创建一个。然后这样用: public class CustomerValidator implements Validator { private final Validator addressValidator; public UserValidator(Validator addressValidator) { if (addressValidator == null) { throw new IllegalArgumentException("The supplied [Validator] is required and must not be null."); } if (!addressValidator.supports(Address.class)) { throw new IllegalArgumentException( "The supplied [Validator] must support the validation of [Address] instances."); } this.addressValidator = addressValidator; } /** * This [code]Validatorvalidates Customerinstances, and any subclasses of Customertoo */ 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(); } } }[/code] 验证错误会被报告到传来的 Errors对象中。在Spring Web MVC中,你可以使用 <spring:bind/>标签来检查错误信息,当然你也可以自行处理错误。可以在它的Javadoc中找到它提供的方法的描述。 |
相关文章推荐
- 使用Spring的Validator接口进行校验
- Spring boot项目 使用ip+port+contextPath进行访问的时候会直接显示出项目中的一些接口信息和相关数据
- struts1中使用Validator插件对表单进行校验
- java使用validator进行校验
- Spring Boot实战之Filter实现使用JWT进行接口认证
- 详解Spring Boot实战之Filter实现使用JWT进行接口认证
- Spring中使用Validator进行数据验证
- Spring Boot实战之Filter实现使用JWT进行接口认证
- SpringBoot项目中使用swagger2暴露resftul接口增加JWT来进行安全性验证
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- SpringBoot接口使用MockMvc进行单元测试
- [置顶] SpringMVC 之 Validation介绍—— 使用Validator接口进行验证
- javaweb接口安全校验预备知识——spring 拦截器interceptor的使用
- springboot使用Validator校验方式
- SpringMVC之使用Validator接口进行验证
- 使用CXF+spring+restful创建一个web的接口项目
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-基于接口驱动的数据层
- SpringMVC + Hibernate-Validator 参数校验
- 详解使用Spring的restTemplete进行Http请求
- cxf的使用及安全校验-02创建简单的客户端接口