关于spring MVC中加载多个validator的方法。

首先讲下什么叫做validator:

validator是验证器,可以验证后台接受的数据,对数据做校验。

SpringMVC服务器验证有两种方式,一种是基于Validator接口,一种是使用Annotaion JSR-303标准的验证。

1.使用Annotaion JSR-303标准的验证

使用这个需要导入支持JSR-303标准的包,建议使用hibernate Validator这个包,先看这个标准的原生标注:

限制说明
@Null限制只能为null
@NotNull限制必须不为null
@AssertFalse限制必须为false
@AssertTrue限制必须为true
@DecimalMax(value)限制必须为一个不大于指定值的数字
@DecimalMin(value)限制必须为一个不小于指定值的数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future限制必须是一个将来的日期
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
@Past限制必须是一个过去的日期
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间
@Past验证注解的元素值(日期类型)比当前时间早
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

要使用很简单,在需要验证的变量前面加上该Annotation即可,看下面使用后的User

1 public class User {
2     @NotEmpty(message = "用户名不能为空")
3     private String username;
4     @Size(min=6 ,max= 20 ,message = "密码长度不符合标准")
5     private String password;
6     private String nickname;
7 
8    ......
9 }

然后再Controller里面的方法上对需要验证的对象或数据加入@Validated就可以了。

2。使用Validator接口

主要是去做Validator实体类,去实现Validator接口:

StudentValidator.java

public class StudentValidator implements Validator{  public boolean supports(Class<?> clazz) {  return Student.class.equals(clazz);  }  public void validate(Object obj, Errors e) {  ValidationUtils.rejectIfEmpty(e, "name", "name.empty");  ValidationUtils.rejectIfEmpty(e, "gender", "null");  ValidationUtils.rejectIfEmpty(e, "age", "null");  Student s = (Student)obj;  if(s.getAge() < 18){  e.rejectValue("age","young");  }else if(s.getAge() > 50){  //e.reject("age", "old");  
        }  }  }  

TeacherValidator.java

public class TeacherValidator implements Validator{  public boolean supports(Class<?> clazz) {  return Teacher.class.equals(clazz);  }  public void validate(Object obj, Errors e) {  ValidationUtils.rejectIfEmpty(e, "name", "name.empty");  ValidationUtils.rejectIfEmpty(e, "gender", "null");  ValidationUtils.rejectIfEmpty(e, "age", "null");  Teacher t= (Teacher)obj;  }  }  

PeopleContorller.java

@Controller
public class UserController {@Autowiredprivate StudentValidator studentValidator;@Autowiredprivate TeacherValidator teacherValidator;@RequestMapping(value="/saveStudent", method = RequestMethod.POST)public void saveStudent(@Valid @RequestBody Student student){.......}@RequestMapping(value="/saveTeacher", method = RequestMethod.POST)public void saveStudent(@Valid @RequestBody Teacher teacher){.......}@InitBinderpublic void initBinder(WebDataBinder binder) {//这个方法加载验证器,判断请求过来的要验证的对象,加载相对于的验证器。此方法是根据请求加载的,即n次请求就加载n次该方法if(studentValidator.supports(binder.getTarget().getClass())&&!studentValidator.getClass().getName().contains("org.springframework")){binder.addValidators(studentValidator);}else{binder.addValidators(teacherValidator);}}
}

ps:需要做判断才能实现多个验证器的存在。

 

转载于:https://www.cnblogs.com/wangzun/p/7157107.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试时,面试官到底在考察什么?

作者&#xff1a;白海飞出处&#xff1a;极客时间《面试现场》专栏 先看一段面试对话&#xff0c;“大面”是一位久经沙场的面试官&#xff0c;小明就是今天的应聘者。一通面试下来&#xff0c;前面的技术问题小明都对答如流&#xff0c;双方相谈甚欢&#xff0c;接下来面试官“…

NoSQL-MongoDB with python

前言&#xff1a; MongoDB&#xff0c;文档存储型数据库&#xff08;document store&#xff09;。NoSQL数据库中&#xff0c;它独占鳌头&#xff0c;碾压其他的NoSQL数据库。 使用C开发的&#xff0c;性能仅次C。与redis一样&#xff0c;开源、高扩展、高可用。 基于分布式文件…

RHCS

云计算与大数据 黑洞 RHCS(概念篇) 一、 什么是RHCS RHCS是Red Hat Cluster Suite的缩写&#xff0c;也就是红帽子集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&…

深度图压缩之-高低8位拆分保存

使用kinect相机保存数据&#xff0c;为了减少保存的数据集量&#xff0c;对图像进行压缩。将彩色图像直接压缩成.mp4格式&#xff0c;此时图像上的一些高频信息会被损失掉。 为了能够让深度图有比较高的保真度&#xff0c;减少深度图上高频信息的损失&#xff0c;我们将16位的…

linux 一个超简单的makefile

2019独角兽企业重金招聘Python工程师标准>>> makefile 自动化变量&#xff1a; $ : 规则的目标文件名 例如&#xff1a;main:main.o test.o g -Wall -g main.o test.o -o main 可以写成&#xff1a; main:main.o test.o g -Wall -g main.o test.o -o $ $< : …

poj2480(利用欧拉函数的积性求解)

题目链接: http://poj.org/problem?id2480 题意&#xff1a;∑gcd(i, N) 1<i <N&#xff0c;就这个公式&#xff0c;给你一个n&#xff0c;让你求sumgcd(1,n)gcd(2,n)gcd(3,n)…………gcd(n-1,n)gcd(n,n),&#xff08;1<n<2^31&#xff09;是多少&#xff1f; 放…

跨域问题

一、为什么会有跨域问题&#xff1f; 是因为浏览器的同源策略是对ajax请求进行阻拦了&#xff0c;但是不是所有的请求都给做跨域&#xff0c;像是一般的href属性&#xff0c;a标签什么的都不拦截。 二、解决跨域问题的两种方式 JSONPCORS 三、JSONP 先简单来说一下JSONP&#x…

PAT A1052

这个需要注意的是相关的string转整数或者double的函数&#xff1b;详见这个链接blog #include <iostream> #include <string> using namespace std; bool isPrime(int n) {if (n 0 || n 1) return false;for (int i 2; i * i < n; i)if (n % i 0) return fa…

php审计学习:xdcms2.0.8注入

注入点Fields: 注册页面会引用如下方法: $fields 变量是从 $fields$_POST[fields]; 这里获取&#xff0c; 在代码里没有过滤。 打印 fields 数据查看: 从代码上看 $field_sql.",{$k}{$f_value}"; 最终会变成: ,truename111111,email12345 因为 $field_sql 最终会引入…

windows下安装python和Python-opencv

背景&#xff1a;目前基于python的图像处理和机器视觉的研究还挺多&#xff0c;最近不是在研究目标检测和目标跟踪的算法&#xff0c;由于检测和跟踪的环境比较简单所以从不带学习的跟踪方法&#xff0c;在搜索资料时搜到这个网站&#xff0c;是对opencv中的目标跟踪算法的一个…

捋一捋js面向对象的继承问题

说到面向对象这个破玩意&#xff0c;曾经一度我都处于很懵逼的状态&#xff0c;那么面向对象究竟是什么呢&#xff1f;其实说白了&#xff0c;所谓面向对象&#xff0c;就是基于类这个概念&#xff0c;来实现封装、继承和多态的一种编程思想罢了。今天我们就来说一下这其中继承…

java8简单入门

1、介绍 本片文章会从一下几个知识点进行介绍&#xff1a; 函数式接口 FunctionalInterfaceLambda 表达式函数引用 Function ReferenceStream看了几篇关于 java8 入门的例子&#xff0c;其中引入了许多令人期待已久的特性&#xff08;虽然我没有过这样的体会&#xff09;&#…

玩转带外触发的单目相机之一

背景&#xff1a;去年开始研究vins,但是只是用了普通的相机&#xff0c;然后将IMU和相机粘在一起&#xff0c;然后就是联合标定相机和IMU。VINS使用的相机是带有外触发的&#xff0c;还进行了相机和IMU的硬件时间同步。当时我特别想买个带外触发的相机&#xff0c;一直没找到资…

基于django的视频点播网站开发-step11-后台用户管理功能...

用户管理功能&#xff0c;包含用户添加、列表展示、编辑、删除四大功能。下面我们一一揭晓。 用户添加 我们先实现用户添加功能&#xff0c;我们现在urls.py下添加相关的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

BZOJ 1070 拆点 费用流

1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5860 Solved: 2487[Submit][Status][Discuss]Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员&#xff0c;不同的技术人员对不同 的车进行维修所用的时间是不…

分布式之数据库和缓存双写一致性方案解析

先做一个说明&#xff0c;从理论上来说&#xff0c;给缓存设置过期时间&#xff0c;是保证最终一致性的解决方案。这种方案下&#xff0c;我们可以对存入缓存的数据设置过期时间&#xff0c;所有的写操作以数据库为准&#xff0c;对缓存操作只是尽最大努力即可。也就是说如果数…

使用python从csv文件中读入两列拟合直线

背景&#xff1a;要判断跟踪算法在控制目标物走直线的情况下跟踪的轨迹是否为直线&#xff0c;我保存下来跟踪算法跟踪到的目标的中心点在图像上的像素位置&#xff0c;然后拟合出穿过这些点的直线&#xff0c;然后计算这些点距离直线的平均距离来判断跟踪的精度。&#xff08;…

window document

1 打开一个新窗口 var newDocwindow.open("text/html","replace");var txt"<html><body>Learning about the DOM is FUN!</body></html>";newDoc.document.write(txt);newDoc.close(); //该方法将关闭 open() 方法打开…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升级一下代码&#xff0c;添加了两个类&#xff0c;再一编译代码&#xff0c;出现了好多这样的错误提示“(:illegal token on right side of ::”&#xff0c;我很纳闷这是啥问题&#xff0c;我就使用“注释法”来定位出错的位置&#xff0c;我发现把所有…

mysql-数据库操作

doc界面操作mysql:<br/> 以phpstudy为例 登录数据库&#xff1a;进入phpstudy/mysql/bin下&#xff0c;mysql -u用户名 -p密码 选择数据库&#xff1a;use 数据库名; 设置编码格式&#xff1a;set names gbk; 查看表结构或字段信息&#xff1a;desc 表名; 建立数据库&…