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

发布时间 - 2026-01-10 23:10:44    点击率:

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

添加相关的Maven依赖

我们先把需要的jar包添加进来。

<dependency> 
  <groupId>javax.validation</groupId> 
  <artifactId>validation-api</artifactId> 
  <version>1.1.0.Final</version> 
</dependency> 
<dependency> 
  <groupId>org.apache.bval</groupId> 
  <artifactId>bval-jsr303</artifactId> 
  <version>0.5</version> 
</dependency> 

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:

package com.zkn.learnspringmvc.validtor; 
 
import com.zkn.learnspringmvc.scope.PersonScope; 
import org.springframework.util.StringUtils; 
import org.springframework.validation.Errors; 
import org.springframework.validation.ValidationUtils; 
import org.springframework.validation.Validator; 
 
/** 
 * Created by wb-zhangkenan on 2016/9/2. 
 */ 
public class PersonalValidtor implements Validator{ 
 
  /** 
   * 判断支持的JavaBean类型 
   * @param aClass 
   * @return 
   */ 
  @Override 
  public boolean supports(Class<?> aClass) { 
    return PersonScope.class.equals(aClass); 
  } 
 
  /** 
   * 实现Validator中的validate接口 
   * @param obj 
   * @param errors 
   */ 
  @Override 
  public void validate(Object obj, Errors errors) { 
    //把校验信息注册到Error的实现类里 
    ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空!"); 
    PersonScope personScope = (PersonScope) obj; 
    if(StringUtils.isEmpty(personScope.getAddress())){ 
      errors.rejectValue("address",null,"家庭地址不能为空!!!!"); 
    } 
  } 
} 

使用Validtor的校验实现类

我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:

//绑定PersonalValidator 
@InitBinder 
public void initBinder(WebDataBinder webDataBinder){ 
  webDataBinder.addValidators(new PersonalValidtor()); 
} 

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

@RequestMapping(value = "testPersonalValidtor.do") 
@ResponseBody 
//直接返回对象 
public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){ 
  if(bindingResult.hasErrors()){ 
    StringBuffer sb = new StringBuffer(); 
    for(ObjectError objectError : bindingResult.getAllErrors()){ 
      sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage()); 
    } 
    return sb.toString(); 
  }else{ 
    return personScope; 
  } 
} 

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

请求:http://localhost:8081/testPersonalValidtor.do

结果:

请求:http://localhost:8081/testPersonalValidtor.do?name=张三&address=三元桥

结果:

具体Controller类代码如下:

package com.zkn.learnspringmvc.news.controller; 
 
import com.alibaba.fastjson.JSON; 
import com.zkn.learnspringmvc.scope.PersonScope; 
import com.zkn.learnspringmvc.validtor.PersonalValidtor; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.BindingResult; 
import org.springframework.validation.FieldError; 
import org.springframework.validation.ObjectError; 
import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
 
import javax.servlet.http.HttpServletResponse; 
import javax.validation.Valid; 
 
/** 
 * 用来测试PersonalValidator的控制器 
 * Created by wb-zhangkenan on 2016/9/2. 
 */ 
@Controller 
public class TestPersonlalValidtorController { 
 
  //绑定PersonalValidator 
  @InitBinder 
  public void initBinder(WebDataBinder webDataBinder){ 
    webDataBinder.addValidators(new PersonalValidtor()); 
  } 
 
  @RequestMapping(value = "testPersonalValidtor.do") 
  @ResponseBody 
  //直接返回对象 
  public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){ 
    if(bindingResult.hasErrors()){ 
      StringBuffer sb = new StringBuffer(); 
      for(ObjectError objectError : bindingResult.getAllErrors()){ 
        sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage()); 
      } 
      return sb.toString(); 
    }else{ 
      return personScope; 
    } 
  } 
} 

PersonScope实体类:

package com.zkn.learnspringmvc.scope; 
 
import java.io.Serializable; 
 
/** 
 * Person对象 
 * @author zkn 
 * 
 */ 
 
public class PersonScope implements Serializable{ 
 
  /** 
   * 序列 
   */ 
  private static final long serialVersionUID = 1L; 
  /** 
   * 姓名 
   */ 
  private String name; 
  /** 
   * 年龄 
   */ 
  private Integer age; 
  /** 
   * 家庭地址 
   */ 
  private String address; 
 
  private StudentScope studentScope; 
 
  public String getName() { 
    return name; 
  } 
   
  public void setName(String name) { 
    this.name = name; 
  } 
   
  public Integer getAge() { 
    return age; 
  } 
   
  public void setAge(Integer age) { 
    this.age = age; 
  } 
 
  @Override 
  public String toString() { 
    return "PersonDomain [name=" + name + ", age=" + age + "]"; 
  } 
 
  public StudentScope getStudentScope() { 
    return studentScope; 
  } 
 
  public void setStudentScope(StudentScope studentScope) { 
    this.studentScope = studentScope; 
  } 
 
  public String getAddress() { 
    return address; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
} 

这里需要注意的是:@Valid要紧挨着JavaBean(即PersonScope),要不然不会生效的。

另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在<mvc:annotation-driven/>中配置validator。写法如下:

<mvc:annotation-driven validator="personalValidtor"> 

<bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/> 

使用<form:errors />标签

上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:

@RequestMapping(value = "testPersonalValidtor02.do") 
public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){ 
  if(bindingResult.hasErrors()){ 
    return "error"; 
  }else{ 
    return "home"; 
  } 
} 

jsp页面内容如下:

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@page pageEncoding="utf-8" contentType="text/html;utf-8"%> 
 
<form:errors path="personScope.name"/> 

注意:<form:errors />标签是SpringMVC提供的,所以我们得引入这个标签库

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # valid注解  # valid注解配置  # valid  # SpringMVC实现Validation校验过程详解  # SpringMVC 数据校验方法(必看篇)  # SpringMVC 数据校验实例解析  # SpringBoot参数校验的最佳实战教程  # SpringMVC中常用参数校验类注解使用示例教程  # 的是  # 错误信息  # 绑定  # 表单  # 需要注意  # 为空  # 在这个  # 在这  # 给我们  # 比较好  # 只在  # 先把  # 来实现  # 写在  # 大家多多  # 先做  # 里用  # 后端  # 那就是  # 三元桥 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: java中使用zxing批量生成二维码立牌  清除minerd进程的简单方法  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  linux top下的 minerd 木马清除方法  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何打造高效商业网站?建站目的决定转化率  网站建设要注意的标准 促进网站用户好感度!  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何在宝塔面板中修改默认建站目录?  如何在万网ECS上快速搭建专属网站?  如何构建满足综合性能需求的优质建站方案?  详解Oracle修改字段类型方法总结  EditPlus中的正则表达式 实战(2)  长沙做网站要多少钱,长沙国安网络怎么样?  如何用VPS主机快速搭建个人网站?  C#如何调用原生C++ COM对象详解  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  在Oracle关闭情况下如何修改spfile的参数  如何在阿里云虚拟主机上快速搭建个人网站?  浅述节点的创建及常见功能的实现  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  北京专业网站制作设计师招聘,北京白云观官方网站?  iOS发送验证码倒计时应用  如何在局域网内绑定自建网站域名?  Java遍历集合的三种方式  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何在Windows 2008云服务器安全搭建网站?  bing浏览器学术搜索入口_bing学术文献检索地址  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  原生JS获取元素集合的子元素宽度实例  phpredis提高消息队列的实时性方法(推荐)  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Java类加载基本过程详细介绍  在线制作视频网站免费,都有哪些好的动漫网站?  南京网站制作费用,南京远驱官方网站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何彻底卸载建站之星软件?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?