Spring_数据校验和自定义检验规则和分组校验
@Validated :绑定需要校验的数据.
数据校验规则:为数据绑定校验的规则
private Long booId;
@NotNull(message = "不能为空")
private String bookName;
private String author;
private String publisher;
@DecimalMin(value = "20",message = "不能低于20元")
@DecimalMax(value = "100",message = "不能多于100")
private Float price;
//正则表达式检验
//正则表达式用来判断某个字符串是否符合某个规则
//或者用来提取一整个字符 串中满足某个规则的子串
@Pattern(regexp = "1[345678][0-9]{9}")
private String Mobile; 为是实体类属性绑定检验规则:
message为检验不合格时的提示信息.
import javax.validation.constraints.*; public class BookBean {
private Long booId;
@NotNull(message = "书名不能为空")
private String bookName;
private String author;
private String publisher;
@DecimalMin(value = "20",message = "不能低于20元")
@NotNull(message = "价格不能为空")
@DecimalMax(value = "100",message = "不能多于100")
private Float price; //正则表达式检验
//正则表达式用来判断某个字符串是否符合某个规则
//或者用来提取一整个字符 串中满足某个规则的子串
@Pattern(regexp = "1[345678][0-9]{9}")
private String Mobile;public String getIdCard() {
return idCard;
} public void setIdCard(String idCard) {
this.idCard = idCard;
} public String getMobile() {
return Mobile;
} public void setMobile(String mobile) {
Mobile = mobile;
} public Long getBooId() {
return booId;
} public void setBooId(Long booId) {
this.booId = booId;
} public String getBookName() {
return bookName;
} public void setBookName(String bookName) {
this.bookName = bookName;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public String getPublisher() {
return publisher;
} public void setPublisher(String publisher) {
this.publisher = publisher;
} public Float getPrice() {
return price;
} public void setPrice(Float price) {
this.price = price;
}
}
绑定数据检验:
注意:校验结果:BindingResult result必须经跟在@Validated BokBean bokBean 后面.用于接受检验的结果.
@RequestMapping("/book/creat")
public String create(@Validated BokBean bokBean, BindingResult result, Model model){ //可以通过BindingResult对象拿到校验的错误信息.
//注意:该参数必须要紧跟在被校验的对象的后面
if (result.hasErrors()){
//判断是否有检验的错误
// result.getFieldError("bookName").getDefaultMessage();
for (FieldError error : result.getFieldErrors()) {
//获取被校验对象的所有错误
String message = error.getDefaultMessage();
System.out.println(message);
}
//可以直接把错误信息的集合都放到集合里
model.addAttribute("erros", result.getFieldErrors());
return "erro";
}
return "success";
}
自定义检验规则,有时候spring自带的检验规则不满足我们使用时,可以自定义检验规则.
检验规则:
public class IDValidator implements ConstraintValidator<IDVlidation,String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//这里引用了一个身份证检验的工具类
return IdCardUtils.isIDCard(value);
}
//这个方法可不实现
@Override
public void initialize(IDVlidation constraintAnnotation) { }
}
自定义一个检验规则的注解,自定义注解见自定义注解章节:https://www.cnblogs.com/zhouchangyang/p/10908343.html
定义这个注解为了方便,可仿造spring定义的注解规则写(赋值粘贴)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) //表明该注解可用在哪里
@Retention(RUNTIME) //表明生效时间
@Repeatable(IDVlidation.List.class)
@Constraint(validatedBy = {IDValidator.class}) //注明该注解所实现的规则是哪个类
public @interface IDVlidation { String message() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@interface List { IDVlidation[] value();
} }
这样就定义好了一个规则的注解,
使用自定义注解和使用系统的注解一样,添加到需要校验的属性上面即可:
@IDVlidation(message = "省份证不符合规范")
private String idCard;
获取校验的后不满足规则的错误信息方式有两种:
一种就像上面一样在 方法参数中检验的对象后面添加 BindingResult result,
@RequestMapping("/book/creat")
public String create(@Validated BokBean bokBean, BindingResult result, Model model){
第二种是单独写一个获取错误信息的方法,在方法上添加注解,@ExceptionHandler(BindException.class),
通过 BindException ex 一样能获得第一种方法的BindingResult 对象.对错误信息的进一步操作和第一种方法一样.
@ExceptionHandler(BindException.class)
public String resolveBindinngExcrption(BindException ex){
//获取错误结果集.
BindingResult result = ex.getBindingResult();
FieldError error = ex.getFieldError();
System.out.println(result);
return "erro";
}
分组校验:
某些时候,我们前端的某些请求需要对某个对象的一部分属性进行校验,有一部分属性不需要校验.
这时我们就需要对校验的属性进行分组,根据前端的需求对属性进行分类.
比如登录和注册业务,他们引用的都是用户对象,但是登录只需要校验用户名和密码,而注册除了校验登录和注册还需要校验很多数据,
假如规定了注册时手机号不能为空,在登陆时不需要手机号,就会报错,这时就需要用分组来针对性的校验.
创建一个实体类,并对属性添加校验规则和分组信息,
public class UserBean { //登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{} @NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
private String username;
@JsonIgnore //表示不想序列化的数据
@NotBlank(groups = {LoginGroup.class,RegisterGroup.class})
private String password;
@Pattern(message = "手机号错误",regexp = "1[3-9][\\d]{9}",groups = {RegisterGroup.class})
@NotNull(message = "手机号不能为空",groups = {RegisterGroup.class})
private String mobile;
@AssertTrue(groups = {RegisterGroup.class})
private boolean agree;
@JsonFormat(pattern = "yyyy-MM-dd-HH:mm:ss",timezone = "GMT+8")
private Date birthday; public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} public boolean isAgree() {
return agree;
} public void setAgree(boolean agree) {
this.agree = agree;
}
}
分组校验用法:
在实体类中创建内部接口类(可以是普通类),用来对业务进行分类,
public class UserBean { //登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{}
在属性的检验规则中添加分组属性 :
@NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
表示这个不能为空的检验规则登录和注册都需要满足.
//登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{} @NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
private String username;
@JsonIgnore //表示不想序列化的数据
@NotBlank(groups = {LoginGroup.class,RegisterGroup.class})
private String password;
@Pattern(message = "手机号错误",regexp = "1[3-9][\\d]{9}",groups = {RegisterGroup.class})
@NotNull(message = "手机号不能为空",groups = {RegisterGroup.class})
private String mobile;
@AssertTrue(message = "必须为真",groups = {RegisterGroup.class})
private boolean agree;
规定好校验规则和分组后,只需在需要校验的地方使用就可以,
用法:在方法参数检验标记中添加分组属性:@Validated(UserBean.LoginGroup.class)
表示只有被UserBean.LoginGroup.class分组的校验规则才会被列入本次校验
@Controller
public class UserController { @RequestMapping("/login")
public String login(@Validated(UserBean.LoginGroup.class) UserBean userBean){
return "success";
} @RequestMapping("/register")
public String register(@Validated(UserBean.RegisterGroup.class) UserBean userBean){
return "success";
}
Spring_数据校验和自定义检验规则和分组校验的更多相关文章
- SpringBoot Validation参数校验 详解自定义注解规则和分组校验
前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ...
- 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示
一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...
- springMVC:校验框架:多规则校验,嵌套校验,分组校验;ssm整合技术
知识点梳理 课堂讲义 学习目标 能够阐述表单验证的分类和区别 能够运用表单验证的常用注解 能够编写表单验证的示例 能够编写SSM整合的应用案例 能够总结SSM整合的步骤 1 校验框架 1.1 入门-视 ...
- 自定义 Lint 规则简介
上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话.深受启发之后,笔者想就此话题做进一步的探索. 定义 如果 ...
- 在ubuntu16.04中安装apache2+modsecurity以及自定义WAF规则详解
一.Modsecurity规则语法示例 SecRule是ModSecurity主要的指令,用于创建安全规则.其基本语法如下: SecRule VARIABLES OPERATOR [ACTIONS] ...
- salesforce 零基础学习(六十三)Comparable实现Object列表数据的自定义排序
项目中通常有些需求为需要将某个sObject的数据列表按照某种规则排序显示到前台页面上,但是list上面的sort远远满足不了复杂的功能,此种情况需要自定义比较两个object大小的方法,所以需要创建 ...
- thinkPHP5.0验证器自定义验证规则
自定义验证规则 protected $rule = [ 'views' => 'require|number|checkviews:0',//checkviews为自定义验证规则,0是传过去的规 ...
- Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则
1.创建一个类来实现AnnotationFormatterFactory接口 代码: package com.oukele.CustomAnnotation; import com.oukele.mo ...
- Django【第16篇】:Django之Form组件自定义验证规则
自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...
随机推荐
- [转] 多个文件目录下Makefile的写法
1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...
- Instrumentation 实践详解
原文地址:https://blog.csdn.net/pengjunlee/article/details/72717622
- 把Debian 设置中文环境
要支持区域设置,首先要安装locales软件包: apt-get install locales 然后配置locales软件包: dpkg-reconfigure locales 在界面中钩选上“zh ...
- 洛谷P3916 图的遍历
题目链接:https://www.luogu.org/problemnew/show/P3916 题目大意 略. 分析 以终为始,逆向思维. 代码如下 #include <bits/stdc++ ...
- Day 13 : 函数递归,
从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀,讲的是,从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀?讲的是?...... 递归:1.一个函数再内部调用了 ...
- JSON Web Token (JWT)生成Token及解密实战。
昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...
- Java异常类及处理
异常概述:运行时发生的不正常情况 在java中用类的形式对不正常的情况进行了描述和封装对象. 描述不正常的类,称之为异常类. 异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述 ...
- JS对象 charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。
返回指定位置的字符 charAt() 方法可返回指定位置的字符.返回的字符是长度为 1 的字符串. 语法: stringObject.charAt(index) 参数说明: 注意:1.字符串中第一个字 ...
- iOS_iPhone App自动化测试
无线客户端的发展很快,特别针对是android和ios两款无线操作系统的客户端应用,相应的测试工具也应运而生,这里主要给大家介绍一些针对 iPhone App的自动化测试工具. 首先 ...
- kaggle 实战 (2): CNN 手写数字识别
文章目录 Tensorflow 官方示例 CNN 提交结果 Tensorflow 官方示例 import tensorflow as tf mnist = tf.keras.datasets.mnis ...