SpringMVC使用@Valid注解进行数据验证

时间:2023-03-10 05:11:07
SpringMVC使用@Valid注解进行数据验证

SpringMVC使用@Valid注解进行数据验证

我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖

我们先把需要的jar包添加进来。
  1. <dependency>
  2. <groupId>javax.validation</groupId>
  3. <artifactId>validation-api</artifactId>
  4. <version>1.1.0.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.bval</groupId>
  8. <artifactId>bval-jsr303</artifactId>
  9. <version>0.5</version>
  10. </dependency>

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:
  1. package com.zkn.learnspringmvc.validtor;
  2. import com.zkn.learnspringmvc.scope.PersonScope;
  3. import org.springframework.util.StringUtils;
  4. import org.springframework.validation.Errors;
  5. import org.springframework.validation.ValidationUtils;
  6. import org.springframework.validation.Validator;
  7. /**
  8. * Created by wb-zhangkenan on 2016/9/2.
  9. */
  10. public class PersonalValidtor implements Validator{
  11. /**
  12. * 判断支持的JavaBean类型
  13. * @param aClass
  14. * @return
  15. */
  16. @Override
  17. public boolean supports(Class<?> aClass) {
  18. return PersonScope.class.equals(aClass);
  19. }
  20. /**
  21. * 实现Validator中的validate接口
  22. * @param obj
  23. * @param errors
  24. */
  25. @Override
  26. public void validate(Object obj, Errors errors) {
  27. //把校验信息注册到Error的实现类里
  28. ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空!");
  29. PersonScope personScope = (PersonScope) obj;
  30. if(StringUtils.isEmpty(personScope.getAddress())){
  31. errors.rejectValue("address",null,"家庭地址不能为空!!!!");
  32. }
  33. }
  34. }

使用Validtor的校验实现类

我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:
  1. //绑定PersonalValidator
  2. @InitBinder
  3. public void initBinder(WebDataBinder webDataBinder){
  4. webDataBinder.addValidators(new PersonalValidtor());
  5. }

接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。

  1. @RequestMapping(value = "testPersonalValidtor.do")
  2. @ResponseBody
  3. //直接返回对象
  4. public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
  5. if(bindingResult.hasErrors()){
  6. StringBuffer sb = new StringBuffer();
  7. for(ObjectError objectError : bindingResult.getAllErrors()){
  8. sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
  9. }
  10. return sb.toString();
  11. }else{
  12. return personScope;
  13. }
  14. }

接下来我们来看一下效果:

请求:http://localhost:8081/testPersonalValidtor.do
结果:
SpringMVC使用@Valid注解进行数据验证
请求:http://localhost:8081/testPersonalValidtor.do?name=张三&address=三元桥
结果:
SpringMVC使用@Valid注解进行数据验证