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"你 ...
随机推荐
- 对A盾原理的小小总结,膜拜A神
A盾的原理是在驱动加载时重载os内核,获取原始ssdt表的地址. 应用层点击查询的代码在文件A-ProtectView.cpp中,每种点击操作调用相应的 query查询函数,在query函数里 Rea ...
- HDU1556-Color the ball-前缀和/线段树/树状数组
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- 20140320 roc曲线 sizeof
1.roc曲线 http://www.zhizhihu.com/html/y2012/4076.html 2.using namespace std的缺点:程序中定义一个变量cout会被误认为是std ...
- Day 12 :迭代器与生成器
可迭代:在Python中如果一个对象有__iter__( )方法,则称这个对象是可迭代的(Iterable): 其中__iter__( )方法的作用是让对象可以用for ... in循环遍历,列表Li ...
- 《转》python学习基础
学习的python本来想自己总结,但是发现了一篇不错的大牛的博客,拿来主义,,又被我实践了 关于前两篇如果总结的不详细,因此把他人的转载过来 http://www.cnblogs.com/BeginM ...
- Java 基础 - Exception和Error
综述 Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基 ...
- scala中类的简单使用记录
import scala.collection.mutable.ArrayBuffer /** * scala 中内部类的使用 */ class Classes { class Stu(name:St ...
- php 垃圾回收机制 转载
PHP的基本GC概念PHP语言同其他语言一样,具有垃圾回收机制.那么今天我们要为大家讲解的内容就是关于PHP垃圾回收机制的相关问题.希望对大家有所帮助.PHP strtotime应用经验之谈PHP m ...
- JavaScript 点击事件的三种写法
嵌入式 <button οnclick='alert("hello")'>点击按钮</button> 脚本模型 btn.onclick=function() ...
- 阿里云SaaS加速器“宜搭”发布宜搭Plus提升6倍研发效率
9月26日,在杭州云栖大会上,阿里云SaaS加速器的“底座”——“宜搭”正式发布“宜搭Plus”低代码开发平台.开发复杂企业业务系统所需要的领域数据模型.逻辑&服务编排.专业UI页面设计等,都 ...