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 】
相关推荐:
如何用虚拟主机快速搭建网站?详细步骤解析
Linux系统命令中tree命令详解
Laravel如何使用Livewire构建动态组件?(入门代码)
Swift中swift中的switch 语句
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
高端建站如何打造兼具美学与转化的品牌官网?
如何快速搭建FTP站点实现文件共享?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
公司门户网站制作流程,华为官网怎么做?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
iOS中将个别页面强制横屏其他页面竖屏
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Python进程池调度策略_任务分发说明【指导】
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何配置任务调度?(Cron Job示例)
如何挑选高效建站主机与优质域名?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
浅谈javascript alert和confirm的美化
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用西部建站助手快速创建专业网站?
青岛网站建设如何选择本地服务器?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel如何优化应用性能?(缓存和优化命令)
Python图片处理进阶教程_Pillow滤镜与图像增强
如何构建满足综合性能需求的优质建站方案?
Python文件操作最佳实践_稳定性说明【指导】
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何为API生成Swagger或OpenAPI文档
HTML 中动态设置元素 name 属性的正确语法详解
C语言设计一个闪闪的圣诞树
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何快速搭建个人网站并优化SEO?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel如何使用Gate和Policy进行授权?(权限控制)
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
EditPlus中的正则表达式实战(6)
如何在建站宝盒中设置产品搜索功能?
如何挑选最适合建站的高性能VPS主机?
如何在 Pandas 中基于一列条件计算另一列的分组均值
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
详解阿里云nginx服务器多站点的配置

