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"你 ...
随机推荐
- PMP项目管理——项目范围管理
项目范围管理包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程.项目范围管理主要在于定义和控制哪些工作应该包括在项目内,哪些不应该包括在项目内. 项目范围管理过程包括: 1 规划范围管理—— ...
- c++-字符串和时间操作
C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符 ...
- (转)在Source Insight中看Python代码
http://blog.csdn.net/lvming404/archive/2009/03/18/4000394.aspx SI是个很强大的代码查看修改工具,以前用来看C,C++都是相当happy的 ...
- CodeForces-1244C-The Football Season-思维
The football season has just ended in Berland. According to the rules of Berland football, each matc ...
- 自学之linux的基本命令
cd cd 用于进入指定文件夹 cd ..用于回到上个文件夹 ls ls用于列出文件夹里的所有元素 ls/home/ 列出home文件夹的元素 ls -l 可以看到文件名,拥有者是谁,什么时候修改的 ...
- Soci介绍
soci是一个用C++封装的数据库访问库,目前通过 “前端(应用程序)/核心/后端(数据库适配)”模式支持firebird,mysql,sqlite3,oracle,postgresql,odbc多种 ...
- element-ui的layout将24等分换为48等分
按住ctr箭点击element-ui/packages/theme-chalk/src/index";,再按住ctr贱点击col.scss跳转,将跳转到的col.scss中的24换为48(c ...
- css元素垂直居中
一.碎碎念:啊啊啊,原谅我只能起一个酱紫微大众微俗气的标题,因为实在没有什么能比这样表达的更清楚直观了呢! 二.没有知识储备,直接上示例: 1.思路:给父元素添加display: table属性:给子 ...
- 2019-8-31-dotnet-数组自动转基类数组提示-Co-variant-array-conversion-是什么问题
title author date CreateTime categories dotnet 数组自动转基类数组提示 Co-variant array conversion 是什么问题 lindexi ...
- WIN10安装CUDA10 cuDNN
文章目录 CPU和GPU 什么是CUDA 什么是cuDNN WIN10安装CUDA10 WIN10安装cuDNN CPU和GPU CPU和GPU是不一样的计算机设备,CPU作为计算机心脏一直被人们所认 ...