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"你 ...
随机推荐
- Beanutils工具类,封装数据的三种方式,单例模式
org.apache.commons.beanutils.Beanutils; Beanutils setProperty(Object obj,String name,Object value) O ...
- CSS Sprites(CSS图像拼合技术)教程、工具集合
本集合是有一位国外设计师收集整合,并由 oncoding翻译成中文的,感谢他们的辛苦贡献.CSS Sprites技术在国外并不是什么新技术,只不过近两年(尤其08年开始)中国开始流行这个词,大家也开始 ...
- 现代软件工程HW2:结对编程-生成五则运算式-Core10组 [PB16110698+PB16120162]
作业具体要求点 这里 Core组要求: 1.Calc() 这个Calc 函数接受字符串的输入(字符串里就是算术表达式,例如 “5*3.5”,“7/8 - 3/8 ”,“3 + 90 * 0.3”等等) ...
- BZOJ2152 聪明可可 点分治
题意传送门 思路:基本的点分治思路,num数组记录从u点开始路径长度分别为1或者2或者3的路径长度(取模3意义下),然后做一个简单的容斥就好了. 为了避免计数的麻烦,<u,u>这样的点单独 ...
- 8.spark Core 进阶1
(e.g. standalone manager, Mesos, YARN) In "cluster" mode, the framework launches the ...
- scala 中List的简单使用
/** * scala 中List的使用 * */ object ListUse { def main(args: Array[String]): Unit = { def decorator(l:L ...
- python 使用字符串
字符串方法 string.digits:包含数字0-9的字符串 string.letters:包含所有字母(大写或小写)的字符串 string.lowercase:包含所有小写字母的字符串 strin ...
- SQL Server SQLFetch()
{ /* 摘要 SQLFetch从结果集中提取下一个数据行集, 并返回所有绑定列的数据. 语法 C++ SQLRETURN SQLFetch( SQLHSTMT StatementHandle ...
- kubernetes配置(kubeconfig)对多集群的访问
配置对多集群的访问 本文展示如何使用配置文件来配置对多个集群的访问. 在将集群.用户和上下文定义在一个或多个配置文件中之后,用户可以使用 kubectl config use-context 命令快速 ...
- C++仿函数和回调函数的异同
C++回调函数(callback)与仿函数(functor)的异同 c++仿函数 functor C++仿函数和回调函数的异同